├── icon.png ├── mod.hjson └── scripts ├── commands ├── action.js ├── create.js ├── entity.js └── set.js ├── get.js ├── main.js ├── rainbow.js ├── tostring.js └── world.js /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sk7725/Commands/7821143549e06a083a9baef42054e3740a4782b2/icon.png -------------------------------------------------------------------------------- /mod.hjson: -------------------------------------------------------------------------------- 1 | name: cmd 2 | displayName: "Commands" 3 | author: "[royal]sk7725[]" 4 | description: "Adds various commands to processors.\nThanks to: DeltaNedas" 5 | version: 0.2 6 | minGameVersion: 110 7 | -------------------------------------------------------------------------------- /scripts/commands/action.js: -------------------------------------------------------------------------------- 1 | const cmdList = ["say", "title", "gamerule", "gamemode", "ratelimit", "playsound", "weather"];//this playsound will play(), not at() 2 | const rateList = ["say", "popuptitle", "texttitle", "bind"]; 3 | const titleList = ["hud", "world", "announce", "infoToast", "popup", "infoPopup", "error", "notice"]; 4 | const rltype = [2, 2, 2, 2, 1, 1, 1, 1]; 5 | 6 | const gamemodeList = ["survival", "sandbox", "attack", "pvp", "editor"]; 7 | 8 | var ratetimer = new Interval(3);//serverside ratelimit interval 9 | var ratelimitlist = [60, 180, 10, 70]; 10 | this.global.commands.ratelimitlist = ratelimitlist; 11 | 12 | var prevecore = null; 13 | 14 | this.global.cmdCategory = Pal.accent; 15 | const cmdCategory = this.global.cmdCategory; 16 | 17 | //const iconList = Object.keys(Icon).filter(s => (typeof Icon[s]) == "object").sort(); 18 | 19 | //partial credits to DeltaNedas 20 | const ActionI = { 21 | _(builder, cmd, astr, atitle, a1, a2, ax, ay) { 22 | this.cmd = builder.var(cmd); 23 | this.astr = builder.var(astr); 24 | this.atitle = builder.var(atitle); 25 | this.a1 = builder.var(a1); 26 | this.a2 = builder.var(a2); 27 | this.ax = builder.var(ax); 28 | this.ay = builder.var(ay); 29 | }, 30 | 31 | run(vm) { 32 | const cmd = vm.numi(this.cmd); 33 | 34 | //print("Cmd: "+cmd); 35 | 36 | switch(cmd){ 37 | case 0: 38 | //say 39 | if(Vars.net.client() || !ratetimer.check(0, ratelimitlist[0])) return; //this is synced 40 | var str = vm.obj(this.astr) + ""; 41 | 42 | if(str == "" || str == "null") return; 43 | Call.sendMessage(str); 44 | ratetimer.reset(0, 0); 45 | break; 46 | 47 | case 1: 48 | var mode = vm.numi(this.a1); 49 | var str = vm.obj(this.astr) + ""; 50 | if(mode < 0 || mode >= titleList.length) return; 51 | var rt = rltype[mode]; 52 | if(Vars.headless || !ratetimer.check(rt, ratelimitlist[rt])) return; 53 | //Vars.ui.hudfrag.showToast(icon, text), (text) 54 | switch(mode){ 55 | case 0: 56 | if(!vm.bool(this.astr)) Vars.ui.hudfrag.toggleHudText(false); 57 | else Vars.ui.hudfrag.setHudText(str); 58 | break; 59 | case 1: 60 | var duration = vm.numf(this.a2); 61 | if(duration <= 0) return; 62 | var cx = vm.numf(this.ax) * Vars.tilesize; var cy = vm.numf(this.ay) * Vars.tilesize; 63 | if(cx <= 0.00001 || cy <= 0.00001 || cx >= Vars.world.unitWidth() || cy >= Vars.world.unitHeight()) return; 64 | Vars.ui.showLabel(str, duration / 60, cx, cy); 65 | break; 66 | case 2: 67 | var duration = vm.numf(this.a2); 68 | if(duration <= 0) return; 69 | Vars.ui.announce(str, duration / 60); 70 | break; 71 | case 3: 72 | var duration = vm.numf(this.a2); 73 | if(duration <= 0) return; 74 | Vars.ui.showInfoToast(str, duration / 60); 75 | break; 76 | case 4: 77 | var title = vm.obj(this.atitle) + ""; 78 | if(title == "null" || title == "undefined") title = ""; 79 | Vars.ui.showText(title, str); 80 | break; 81 | case 5: 82 | var title = vm.obj(this.atitle) + ""; 83 | if(title == "null" || title == "undefined") title = ""; 84 | Vars.ui.showInfoText(title, str); 85 | break; 86 | case 6: 87 | Vars.ui.showErrorMessage(str); 88 | break; 89 | case 7: 90 | var icon = vm.obj(this.atitle); 91 | try{ 92 | Vars.ui.hudfrag.showToast(Icon[icon + ""], str); 93 | } 94 | catch(notFound){ 95 | Vars.ui.hudfrag.showToast(str); 96 | } 97 | break; 98 | default: 99 | } 100 | ratetimer.reset(rt, 0); 101 | break; 102 | 103 | case 2: 104 | //gamerule 105 | var str = vm.obj(this.astr) + ""; 106 | try{ 107 | var rule = Vars.state.rules[str]; 108 | switch(typeof rule){ 109 | case "boolean": 110 | Vars.state.rules[str] = vm.bool(this.atitle); 111 | break; 112 | case "number": 113 | Vars.state.rules[str] = vm.numf(this.atitle); 114 | break; 115 | default: 116 | //nope. 117 | } 118 | } 119 | catch(ruleNotFound){} 120 | break; 121 | 122 | case 3: 123 | //gamemode 124 | var type = vm.numi(this.astr); 125 | if(type > 4 || type < 0) return; 126 | if(type != 4 && prevecore !== null){ 127 | Vars.state.rules.enemyCoreBuildRadius = prevecore; 128 | prevecore = null; 129 | Vars.state.rules.editor = false; 130 | } 131 | switch(type){ 132 | case 0: 133 | Vars.state.rules.waveTimer = true; 134 | Vars.state.rules.waves = true; 135 | Vars.state.rules.infiniteResources = false; 136 | Vars.state.rules.attackMode = false; 137 | Vars.state.rules.pvp = false; 138 | break; 139 | case 1: 140 | Vars.state.rules.waveTimer = false; 141 | Vars.state.rules.waves = true; 142 | Vars.state.rules.infiniteResources = true; 143 | Vars.state.rules.attackMode = false; 144 | Vars.state.rules.pvp = false; 145 | break; 146 | case 2: 147 | Vars.state.rules.waveTimer = true; 148 | Vars.state.rules.waves = true; 149 | Vars.state.rules.infiniteResources = false; 150 | Vars.state.rules.attackMode = true; 151 | Vars.state.rules.pvp = false; 152 | break; 153 | case 3: 154 | Vars.state.rules.waveTimer = true; 155 | Vars.state.rules.waves = true; 156 | Vars.state.rules.infiniteResources = false; 157 | Vars.state.rules.attackMode = true; 158 | Vars.state.rules.pvp = true; 159 | break; 160 | case 4: 161 | Vars.state.rules.waveTimer = false; 162 | Vars.state.rules.waves = false; 163 | Vars.state.rules.infiniteResources = true; 164 | Vars.state.rules.attackMode = false; 165 | Vars.state.rules.pvp = false; 166 | Vars.state.rules.editor = true; 167 | if(prevecore === null) prevecore = Vars.state.rules.enemyCoreBuildRadius - 0; 168 | Vars.state.rules.enemyCoreBuildRadius = 0; 169 | break; 170 | default: 171 | } 172 | break; 173 | 174 | case 4: 175 | //ratelimit 176 | if(Vars.net.client()) return; 177 | var type = vm.numi(this.astr); 178 | var ticks = vm.numi(this.atitle); 179 | if(type < 0 || type > 3 || ticks < 0) return; 180 | ratelimitlist[type] = ticks; 181 | break; 182 | 183 | case 5: 184 | //playsound 1 185 | if(Vars.headless) return;//headless is deaf 186 | var sound = vm.obj(this.astr) + ""; 187 | if(sound == "" || sound == "null") return; 188 | 189 | var vol = vm.numf(this.atitle); 190 | vol = Mathf.clamp(vol, 0, 1); 191 | vol *= (Core.settings.getInt("sfxvol") / 100); 192 | 193 | var pitch = vm.numf(this.a1); 194 | if(pitch <= 0.00001) pitch = 1; 195 | //pitch = Mathf.clamp(pitch, 0.5, 2.0); 196 | var pan = Mathf.clamp(vm.numf(this.a2), -1.0, 1.0); 197 | 198 | try{ 199 | Sounds[sound].play(vol, pitch, pan); 200 | } 201 | catch(notFound){} 202 | break; 203 | 204 | case 6: 205 | //weather 206 | var weather = vm.obj(this.astr); 207 | if(!(weather instanceof Weather)) return; 208 | //print(weather); 209 | if(!weather.isActive()) weather.create(vm.numf(this.a1), vm.numf(this.atitle)); 210 | break; 211 | 212 | default: 213 | 214 | //end 215 | } 216 | } 217 | }; 218 | 219 | const ActionStatement = { 220 | new: words => { 221 | const st = extend(LStatement, Object.create(ActionStatement)); 222 | st.read(words); 223 | return st; 224 | }, 225 | 226 | read(words) { 227 | this.cmd = (isNaN(Number(words[1]))) ? cmdList.indexOf(words[1]) : words[1]; 228 | this.astr = words[2]; 229 | this.atitle = words[3]; 230 | this.a1 = words[4]; 231 | this.a2 = words[5]; 232 | this.ax = words[6]; 233 | this.ay = words[7]; 234 | }, 235 | 236 | build(h) { 237 | if (h instanceof Table) { 238 | return this.buildt(h); 239 | } 240 | 241 | const inst = extend(LExecutor.LInstruction, Object.create(ActionI)); 242 | inst._(h, this.cmd, this.astr, this.atitle, this.a1, this.a2, this.ax, this.ay); 243 | return inst; 244 | }, 245 | 246 | buildt(table) { 247 | //todo dropdown 248 | table.clearChildren();//this just sounds horrible 249 | 250 | this.fieldlist(table, cmdList, this.cmd, "cmd", table); 251 | switch(Number(this.cmd)){ 252 | case 0: 253 | table.add(" message"); 254 | this.field(table, this.astr, text => {this.astr = text}).width(0).growX().padRight(3); 255 | 256 | break; 257 | 258 | case 1: 259 | this.row(table); 260 | table.table(cons(t => { 261 | t.left(); 262 | t.setColor(table.color); 263 | t.add(" message"); 264 | this.field(t, this.astr, text => {this.astr = text}).width(0).growX(); 265 | if(this.a1 == 4 || this.a1 == 5 || this.a1 == 7){ 266 | this.row(t); 267 | t.add((this.a1 == 7)? " icon" : " title"); 268 | this.field(t, this.atitle, text => {this.atitle = text}).width(180).padRight(3); 269 | } 270 | 271 | })).left(); 272 | 273 | table.row(); 274 | if(!LCanvas.useRows()) table.add(); 275 | table.table(cons(t => { 276 | t.left(); 277 | t.setColor(table.color); 278 | t.add(" type"); 279 | this.fieldlist(t, titleList, this.a1, "a1", table); 280 | if(this.a1 == 1 || this.a1 == 2 || this.a1 == 3) this.fields(t, "duration", this.a2, text => {this.a2 = text}); 281 | //hud, world, announce, infomessage, infotoast 282 | if(this.a1 == 1){ 283 | this.row(t); 284 | this.fields(t, "x", this.ax, text => {this.ax = text}); 285 | this.fields(t, "y", this.ay, text => {this.ay = text}); 286 | } 287 | })).left(); 288 | break; 289 | 290 | case 2: 291 | this.row(table); 292 | this.fields(table, "rule", this.astr, text => {this.astr = text}).width(180); 293 | this.row(table); 294 | this.fields(table, "value", this.atitle, text => {this.atitle = text}); 295 | break; 296 | 297 | case 3: 298 | table.add(" mode"); 299 | this.fieldlist(table, gamemodeList, this.astr, "astr", table); 300 | break; 301 | 302 | case 4: 303 | table.add(" type"); 304 | this.fieldlist(table, rateList, this.astr, "astr", table); 305 | this.row(table); 306 | this.fields(table, "ticks", this.atitle, text => {this.atitle = text}); 307 | break; 308 | 309 | case 5: 310 | this.row(table); 311 | table.table(cons(t => { 312 | t.left(); 313 | t.setColor(table.color); 314 | this.fields(t, "sound", this.astr, text => {this.astr = text}); 315 | this.fields(t, "volume", this.atitle, text => {this.atitle = text}); 316 | this.row(t); 317 | this.fields(t, "pitch", this.a1, text => {this.a1 = text}); 318 | this.fields(t, "pan", this.a2, text => {this.a2 = text}); 319 | })).left(); 320 | break; 321 | 322 | case 6: 323 | this.row(table); 324 | this.field(table, this.astr, text => {this.astr = text}).width(85).left(); 325 | this.row(table); 326 | table.table(cons(t => { 327 | t.left(); 328 | t.setColor(table.color); 329 | this.fields(t, "duration", this.atitle, text => {this.atitle = text}); 330 | this.fields(t, "intensity", this.a1, text => {this.a1 = text}); 331 | })).left(); 332 | 333 | break; 334 | 335 | default: 336 | this.row(table); 337 | table.add("[lightgray]invalid command[]"); 338 | } 339 | 340 | }, 341 | 342 | fieldlist(table, list, def, defname, parent){ 343 | var b = new Button(Styles.logict); 344 | //var n = Number(def); 345 | //if(isNaN(n) || n < 0 || n >= list.length) this[defname] = 0; 346 | b.label(prov(() => ((defname == "cmd")?"/":"") + list[Number(def)])); 347 | b.clicked(() => this.showSelect(b, list, list[Number(def)], t => { 348 | this[defname] = list.indexOf(t); 349 | if(parent !== false) this.buildt(parent); 350 | }, 2, cell => cell.size(100, 50))); 351 | table.add(b).size(120, 40).color(table.color).left().padLeft(2); 352 | }, 353 | 354 | write(builder) { 355 | builder.append("cmdaction " + cmdList[this.cmd] + ""); 356 | builder.append(" "); 357 | builder.append(this.astr + ""); 358 | builder.append(" "); 359 | builder.append(this.atitle + ""); 360 | builder.append(" "); 361 | builder.append(this.a1 + ""); 362 | builder.append(" "); 363 | builder.append(this.a2 + ""); 364 | builder.append(" "); 365 | builder.append(this.ax + ""); 366 | builder.append(" "); 367 | builder.append(this.ay + ""); 368 | }, 369 | 370 | name: () => "Command: Action", 371 | color: () => cmdCategory 372 | }; 373 | 374 | /* Mimic @RegisterStatement */ 375 | LAssembler.customParsers.put("cmdaction", func(ActionStatement.new)); 376 | 377 | LogicIO.allStatements.add(prov(() => ActionStatement.new([ 378 | "cmdaction", 379 | "0", 380 | '""', 381 | "", 382 | "1", 383 | "0", 384 | "0", 385 | "0" 386 | ]))); 387 | -------------------------------------------------------------------------------- /scripts/commands/create.js: -------------------------------------------------------------------------------- 1 | const cmdList = ["summon", "shoot", "fx", "playsound", "puddle", "burn"];//this playsound will at(), not play() 2 | 3 | const cmdCategory = this.global.cmdCategory; 4 | 5 | //partial credits to DeltaNedas 6 | const CreateI = { 7 | _(builder, cmd, atype, ax, ay, ar, at, av, al, aowner) { 8 | this.cmd = builder.var(cmd); 9 | this.atype = builder.var(atype); 10 | this.ax = builder.var(ax); 11 | this.ay = builder.var(ay); 12 | this.ar = builder.var(ar); 13 | this.at = builder.var(at); 14 | this.av = builder.var(av); 15 | this.al = builder.var(al); 16 | this.aowner = builder.var(aowner); 17 | }, 18 | 19 | run(vm) { 20 | const cmd = vm.numi(this.cmd); 21 | 22 | var type = vm.obj(this.atype); 23 | var cx = vm.num(this.ax) * Vars.tilesize; 24 | var cy = vm.num(this.ay) * Vars.tilesize; 25 | 26 | if((type == null && cmd != 5) || cx <= 0.00001 || cy <= 0.00001 || cx >= Vars.world.unitWidth() || cy >= Vars.world.unitHeight()) return; 27 | 28 | switch(cmd){ 29 | case 0: 30 | if(!(type instanceof UnitType)) return; 31 | var team = Team.get(vm.numi(this.ar)); 32 | var u = type.create(team); 33 | u.set(cx, cy); 34 | if(!Vars.net.client()) u.add(); 35 | break; 36 | case 1: 37 | if(!(type instanceof BulletType)) return; 38 | var team = Team.get(vm.numi(this.at)); 39 | //var owner = vm.obj(this.aowner); 40 | //if(owner == "" || owner == null || (typeof owner) != "object") owner = null; 41 | //else if(!(owner instanceof Entityc)) owner = null; 42 | var dmg = (vm.vars[this.aowner].isobj) ? -1 : vm.numf(this.aowner); 43 | type.create(null, team, cx, cy, vm.numf(this.ar), dmg, vm.numf(this.av), vm.numf(this.al), null); 44 | break; 45 | case 2: 46 | if(Vars.headless) return; 47 | var color = vm.obj(this.at); 48 | if((typeof color) == "string") color = Color.valueOf(color); 49 | else color = Color.white; 50 | //print("FX ("+cx+", "+cy+")"); 51 | try{ 52 | Fx[type + ""].at(cx, cy, vm.numf(this.ar), color); 53 | } 54 | catch(err){ 55 | //print(err); 56 | } 57 | break; 58 | case 3: 59 | if(Vars.headless) return; 60 | try{ 61 | Sounds[type + ""].at(cx, cy, vm.numf(this.ar), vm.numf(this.at)); 62 | } 63 | catch(notFound){} 64 | break; 65 | case 4: 66 | if(!(type instanceof Liquid) || Vars.world.tileWorld(cx, cy) == null) return; 67 | Puddles.deposit(Vars.world.tileWorld(cx, cy), type, vm.numf(this.ar)); 68 | break; 69 | case 5: 70 | if(Vars.world.tileWorld(cx, cy) == null) return; 71 | Fires.create(Vars.world.tileWorld(cx, cy)); 72 | break; 73 | default: 74 | 75 | //end 76 | } 77 | } 78 | }; 79 | 80 | const CreateStatement = { 81 | new: words => { 82 | const st = extend(LStatement, Object.create(CreateStatement)); 83 | st.read(words); 84 | return st; 85 | }, 86 | 87 | read(words) { 88 | this.cmd = (isNaN(Number(words[1]))) ? cmdList.indexOf(words[1]) : words[1]; 89 | this.atype = words[2]; 90 | this.ax = words[3]; 91 | this.ay = words[4]; 92 | this.ar = words[5]; 93 | this.at = words[6]; 94 | this.av = words[7]; 95 | this.al = words[8]; 96 | this.aowner = words[9]; 97 | }, 98 | 99 | build(h) { 100 | if (h instanceof Table) { 101 | return this.buildt(h); 102 | } 103 | 104 | const inst = extend(LExecutor.LInstruction, Object.create(CreateI)); 105 | inst._(h, this.cmd, this.atype, this.ax, this.ay, this.ar, this.at, this.av, this.al, this.aowner); 106 | return inst; 107 | }, 108 | 109 | buildt(table) { 110 | //todo dropdown 111 | table.clearChildren();//this just sounds horrible 112 | 113 | this.fieldlist(table, cmdList, this.cmd, "cmd", table); 114 | /* 115 | this.field(table, this.atype, text => {this.atype = text}).width(85); 116 | this.row(table); 117 | this.fields(table, "x", this.ax, text => {this.ax = text}); 118 | this.fields(table, "y", this.ay, text => {this.ay = text}); 119 | this.row(table);*/ 120 | switch(Number(this.cmd)){ 121 | case 0: 122 | this.field(table, this.atype, text => {this.atype = text}).width(85); 123 | this.row(table); 124 | this.fields(table, "x", this.ax, text => {this.ax = text}); 125 | this.fields(table, "y", this.ay, text => {this.ay = text}); 126 | this.row(table); 127 | this.fields(table, "team", this.ar, text => {this.ar = text}); 128 | break; 129 | 130 | case 1: 131 | this.row(table); 132 | table.table(cons(t => { 133 | t.left(); 134 | t.setColor(table.color); 135 | this.field(t, this.atype, text => {this.atype = text}).width(85); 136 | this.row(t); 137 | this.fields(t, "x", this.ax, text => {this.ax = text}); 138 | this.fields(t, "y", this.ay, text => {this.ay = text}); 139 | this.row(t); 140 | this.fields(t, "rotation", this.ar, text => {this.ar = text}); 141 | this.fields(t, "team", this.at, text => {this.at = text}); 142 | })).left(); 143 | 144 | //this.row(table); 145 | table.row(); 146 | if(!LCanvas.useRows()) table.add(); 147 | table.table(cons(t => { 148 | t.left(); 149 | t.setColor(table.color); 150 | this.fields(t, "velocity", this.av, text => {this.av = text}); 151 | this.fields(t, "lifetime", this.al, text => {this.al = text}); 152 | this.row(t); 153 | this.fields(t, "damage", this.aowner, text => {this.aowner = text}); 154 | })).left(); 155 | 156 | break; 157 | 158 | case 2: 159 | this.field(table, this.atype, text => {this.atype = text}).width(85); 160 | this.row(table); 161 | this.fields(table, "x", this.ax, text => {this.ax = text}); 162 | this.fields(table, "y", this.ay, text => {this.ay = text}); 163 | this.row(table); 164 | this.fields(table, "rotation", this.ar, text => {this.ar = text}); 165 | this.fields(table, "color", this.at, text => {this.at = text}); 166 | //this.row(); 167 | //this.fields(table, "data", this.av, text => {this.av = text}); 168 | break; 169 | 170 | case 3: 171 | this.field(table, this.atype, text => {this.atype = text}).width(85); 172 | this.row(table); 173 | this.fields(table, "x", this.ax, text => {this.ax = text}); 174 | this.fields(table, "y", this.ay, text => {this.ay = text}); 175 | this.row(table); 176 | this.fields(table, "pitch", this.ar, text => {this.ar = text}); 177 | this.fields(table, "volume", this.at, text => {this.at = text}); 178 | break; 179 | 180 | case 4: 181 | this.field(table, this.atype, text => {this.atype = text}).width(85); 182 | this.row(table); 183 | this.fields(table, "x", this.ax, text => {this.ax = text}); 184 | this.fields(table, "y", this.ay, text => {this.ay = text}); 185 | this.row(table); 186 | this.fields(table, "amount", this.ar, text => {this.ar = text}); 187 | break; 188 | 189 | case 5: 190 | this.fields(table, "x", this.ax, text => {this.ax = text}); 191 | this.fields(table, "y", this.ay, text => {this.ay = text}); 192 | break; 193 | 194 | default: 195 | this.row(table); 196 | table.add("[lightgray]invalid command[]"); 197 | } 198 | 199 | }, 200 | 201 | fieldlist(table, list, def, defname, parent){ 202 | var b = new Button(Styles.logict); 203 | //var n = Number(def); 204 | //if(isNaN(n) || n < 0 || n >= list.length) this[defname] = 0; 205 | b.label(prov(() => ((defname == "cmd")?"/":"") + list[Number(def)])); 206 | b.clicked(() => this.showSelect(b, list, list[Number(def)], t => { 207 | this[defname] = list.indexOf(t); 208 | if(parent !== false) this.buildt(parent); 209 | }, 2, cell => cell.size(100, 50))); 210 | table.add(b).size(120, 40).color(table.color).left().padLeft(2); 211 | }, 212 | 213 | write(builder) { 214 | builder.append("cmdcreate " + cmdList[this.cmd] + ""); 215 | builder.append(" "); 216 | builder.append(this.atype + ""); 217 | builder.append(" "); 218 | builder.append(this.ax + ""); 219 | builder.append(" "); 220 | builder.append(this.ay + ""); 221 | builder.append(" "); 222 | builder.append(this.ar + ""); 223 | builder.append(" "); 224 | builder.append(this.at + ""); 225 | builder.append(" "); 226 | builder.append(this.av + ""); 227 | builder.append(" "); 228 | builder.append(this.al + ""); 229 | builder.append(" "); 230 | builder.append(this.aowner + ""); 231 | }, 232 | 233 | name: () => "Command: Create", 234 | color: () => cmdCategory 235 | }; 236 | 237 | /* Mimic @RegisterStatement */ 238 | LAssembler.customParsers.put("cmdcreate", func(CreateStatement.new)); 239 | 240 | LogicIO.allStatements.add(prov(() => CreateStatement.new([ 241 | "cmdcreate", 242 | "0", 243 | "", 244 | "0", 245 | "0", 246 | "1", 247 | "1", 248 | "1", 249 | "1", 250 | "-1" 251 | ]))); 252 | -------------------------------------------------------------------------------- /scripts/commands/entity.js: -------------------------------------------------------------------------------- 1 | const cmdList = ["tp", "damage", "kill", "give", "clear", "effect", "team", "bind"]; 2 | const tpList = ["-", "angle", "facing"]; 3 | const effectList = ["apply", "clear"]; 4 | const damageList = ["points", "%", "f"]; 5 | const giveList = ["keep", "force"]; 6 | 7 | const cmdCategory = this.global.cmdCategory; 8 | 9 | var ratetimer = new Interval(1); 10 | var rllist = this.global.commands.ratelimitlist; 11 | 12 | //partial credits to DeltaNedas 13 | const EntityI = { 14 | _(builder, cmd, atype, ax, ay, ar, at, av) { 15 | this.cmd = builder.var(cmd); 16 | this.atype = builder.var(atype); 17 | this.ax = builder.var(ax); 18 | this.ay = builder.var(ay); 19 | this.ar = builder.var(ar); 20 | this.at = builder.var(at); 21 | this.av = builder.var(av); 22 | }, 23 | 24 | validPos(x, y){ 25 | return !(x <= 0.00001 || y <= 0.00001 || x >= Vars.world.unitWidth() || y >= Vars.world.unitHeight()); 26 | }, 27 | 28 | run(vm) { 29 | const cmd = vm.numi(this.cmd); 30 | 31 | var ent = vm.obj(this.atype); 32 | //var cx = vm.num(this.ax) * Vars.tilesize; 33 | //var cy = vm.num(this.ay) * Vars.tilesize; 34 | 35 | //if((type == null && cmd != 5) || cx <= 0.00001 || cy <= 0.00001 || cx >= Vars.world.unitWidth() || cy >= Vars.world.unitHeight()) return; 36 | 37 | switch(cmd){ 38 | case 0: 39 | //tp 40 | if(ent == null) return; 41 | var cx = vm.num(this.ax) * Vars.tilesize; 42 | var cy = vm.num(this.ay) * Vars.tilesize; 43 | if(!this.validPos(cx, cy)) return; 44 | this.tp(vm, ent, cx, cy); 45 | break; 46 | case 1: 47 | //damage 48 | if(ent == null) return; 49 | this.damage(vm, ent); 50 | break; 51 | case 2: 52 | //kill 53 | if(ent == null) return; 54 | this.kill(vm, ent); 55 | break; 56 | case 3: 57 | //give 58 | if(ent == null) return; 59 | var item = vm.obj(this.ax); 60 | if(item == null) return; 61 | if(item instanceof Item){ 62 | this.give(vm, ent, item); 63 | } 64 | else if(item instanceof Liquid){ 65 | this.giveliquid(vm, ent, item); 66 | } 67 | break; 68 | case 4: 69 | //clear 70 | if(ent == null) return; 71 | this.clear(vm, ent); 72 | break; 73 | case 5: 74 | //kill 75 | if(ent == null) return; 76 | this.effect(vm, ent); 77 | break; 78 | case 6: 79 | //kill 80 | if(ent == null) return; 81 | this.team(vm, ent); 82 | break; 83 | case 7: 84 | //bind 85 | if(ent == null) return; 86 | if((ent instanceof Unit) && ent.isPlayer()){ 87 | var cunit = vm.obj(this.ax); 88 | if(cunit == ent) return; 89 | if(cunit == null){ 90 | if(!ent.spawnedByCore) this.unbind(vm, ent); 91 | } 92 | else if((cunit instanceof Unit) && !cunit.isPlayer()){ 93 | this.bind(vm, ent, cunit); 94 | } 95 | else if((cunit instanceof ControlBlock) && cunit.canControl() && !cunit.isControlled()){ 96 | this.bind(vm, ent, cunit.unit); 97 | } 98 | } 99 | else if((ent instanceof ControlBlock) && ent.isControlled()){ 100 | var cunit = vm.obj(this.ax); 101 | if(cunit == ent) return; 102 | if(cunit == null){ 103 | this.unbind(vm, ent.unit); 104 | } 105 | else if((cunit instanceof Unit) && !cunit.isPlayer()){ 106 | this.bind(vm, ent.unit, cunit); 107 | } 108 | else if((cunit instanceof ControlBlock) && cunit.canControl() && !cunit.isControlled()){ 109 | this.bind(vm, ent.unit, cunit.unit); 110 | } 111 | } 112 | break; 113 | default: 114 | 115 | //end 116 | } 117 | }, 118 | 119 | tp(vm, ent, cx, cy){ 120 | if(ent instanceof Unit){ 121 | ent.set(cx, cy); 122 | ent.snapInterpolation(); 123 | switch(vm.numi(this.ar)){ 124 | case 1: 125 | ent.rotation = vm.numf(this.at); 126 | break; 127 | case 2: 128 | var ex = vm.num(this.at) * Vars.tilesize; 129 | var ey = vm.num(this.av) * Vars.tilesize; 130 | if(!this.validPos(ex, ey)) return; 131 | ent.rotation = Tmp.v1.set(ex - ent.x, ey - ent.y).angle(); 132 | break; 133 | } 134 | } 135 | else if(ent instanceof Bullet){ 136 | ent.set(cx, cy); 137 | switch(vm.numi(this.ar)){ 138 | case 1: 139 | ent.rotation(vm.numf(this.at)); 140 | break; 141 | case 2: 142 | var ex = vm.num(this.at) * Vars.tilesize; 143 | var ey = vm.num(this.av) * Vars.tilesize; 144 | if(!this.validPos(ex, ey)) return; 145 | ent.rotation(Tmp.v1.set(ex - ent.x, ey - ent.y).angle()); 146 | break; 147 | } 148 | } 149 | else return; 150 | }, 151 | kill(vm, ent){ 152 | if(ent instanceof Healthc) ent.kill(); 153 | else if(ent instanceof Bullet) ent.remove(); 154 | }, 155 | damage(vm, ent){ 156 | if(!(ent instanceof Healthc)) return; 157 | var amount = vm.numf(this.ax); 158 | if(amount < 0){ 159 | switch(vm.numi(this.ay)){ 160 | case 0: 161 | ent.heal(-1 * amount); 162 | break; 163 | case 1: 164 | ent.healFract(-1 * amount / 100); 165 | break; 166 | case 2: 167 | ent.healFract(-1 * amount); 168 | break; 169 | } 170 | } 171 | else{ 172 | switch(vm.numi(this.ay)){ 173 | case 0: 174 | ent.damage(amount); 175 | break; 176 | case 1: 177 | ent.damage(ent.maxHealth * amount / 100); 178 | break; 179 | case 2: 180 | ent.damage(ent.maxHealth * amount); 181 | break; 182 | } 183 | } 184 | }, 185 | effect(vm, ent){ 186 | if(!(ent instanceof Statusc)) return; 187 | var stat = vm.obj(this.ax); 188 | if(stat == null || !(stat instanceof StatusEffect)) return; 189 | if(vm.numi(this.ay) == 0){ 190 | //apply 191 | ent.apply(stat, Math.max(0, vm.numf(this.ar))); 192 | } 193 | else{ 194 | ent.unapply(stat); 195 | } 196 | }, 197 | team(vm, ent){ 198 | if(ent instanceof Unit){ 199 | if(ent.isPlayer()) ent.getPlayer().team(Team.get(vm.numi(this.ax))); 200 | else ent.team = Team.get(vm.numi(this.ax)); 201 | } 202 | else if(ent instanceof Teamc){ 203 | ent.team = Team.get(vm.numi(this.ax)); 204 | } 205 | }, 206 | clear(vm, ent){ 207 | if(ent instanceof Itemsc){ 208 | ent.clearItem(); 209 | } 210 | else if((ent instanceof Building) && ent.items != null) ent.items.clear(); 211 | }, 212 | give(vm, ent, item){ 213 | if(ent instanceof Itemsc){ 214 | if(!(vm.numi(this.ar) == 0) || ent.acceptsItem(item)) ent.addItem(item, vm.numi(this.ay)); 215 | } 216 | else if((ent instanceof Building) && ent.items != null){ 217 | var amount = vm.numi(this.ay); 218 | if(amount == 0) return; 219 | if(amount > 0){ 220 | var real = (vm.numi(this.ar) == 0 || (ent.block instanceof Turret)) ? ent.acceptStack(item, amount, null) : Math.min(amount, ent.getMaximumAccepted(item) - ent.items.get(item)); 221 | if(real <= 0) return; 222 | ent.handleStack(item, real, null); 223 | } 224 | else{ 225 | ent.items.remove(item, -1 * amount); 226 | } 227 | } 228 | }, 229 | giveliquid(vm, ent, liquid){ 230 | if(!(ent instanceof Building) || (ent.block instanceof LiquidTurret)) return; 231 | if(ent.liquids == null) return; 232 | var amount = vm.numf(this.ay); 233 | if(amount == 0) return; 234 | if(amount > 0){ 235 | if(!(vm.numi(this.ar) == 0) || (ent.block.hasLiquids && ent.block.consumes != null && ent.block.consumes.liquidfilters.get(liquid.id))){ 236 | var real = Math.min(amount, ent.block.liquidCapacity - ent.liquids.get(liquid)); 237 | if(real <= 0) return; 238 | ent.liquids.add(liquid, amount); 239 | } 240 | } 241 | else{ 242 | ent.liquids.add(liquid, Math.max(amount, -1 * ent.liquids.get(liquid))); 243 | } 244 | }, 245 | bind(vm, player, unit){ 246 | if(Vars.player == player.getPlayer() && ratetimer.get(0, rllist[3])){ 247 | Call.unitControl(player.getPlayer(), unit); 248 | if(!Vars.mobile) Vars.control.input.shouldShoot = false; 249 | } 250 | }, 251 | unbind(vm, player){ 252 | //call should work...? 253 | if(Vars.player == player.getPlayer() && ratetimer.get(0, rllist[3])){ 254 | Call.unitClear(player.getPlayer()); 255 | Vars.control.input.controlledType = null; 256 | } 257 | } 258 | }; 259 | 260 | const EntityStatement = { 261 | new: words => { 262 | const st = extend(LStatement, Object.create(EntityStatement)); 263 | st.read(words); 264 | return st; 265 | }, 266 | 267 | read(words) { 268 | this.cmd = (isNaN(Number(words[1]))) ? cmdList.indexOf(words[1]) : words[1]; 269 | this.atype = words[2]; 270 | this.ax = words[3]; 271 | this.ay = words[4]; 272 | this.ar = words[5]; 273 | this.at = words[6]; 274 | this.av = words[7]; 275 | }, 276 | 277 | build(h) { 278 | if (h instanceof Table) { 279 | return this.buildt(h); 280 | } 281 | 282 | const inst = extend(LExecutor.LInstruction, Object.create(EntityI)); 283 | inst._(h, this.cmd, this.atype, this.ax, this.ay, this.ar, this.at, this.av); 284 | return inst; 285 | }, 286 | 287 | buildt(table) { 288 | //todo dropdown 289 | table.clearChildren();//this just sounds horrible 290 | 291 | this.fieldlist(table, cmdList, this.cmd, "cmd", table); 292 | /* 293 | this.field(table, this.atype, text => {this.atype = text}).width(85); 294 | this.row(table); 295 | this.fields(table, "x", this.ax, text => {this.ax = text}); 296 | this.fields(table, "y", this.ay, text => {this.ay = text}); 297 | this.row(table);*/ 298 | switch(Number(this.cmd)){ 299 | case 0: 300 | //tp 301 | this.field(table, this.atype, text => {this.atype = text}).width(85); 302 | this.row(table); 303 | this.fields(table, "x", this.ax, text => {this.ax = text}); 304 | this.fields(table, "y", this.ay, text => {this.ay = text}); 305 | this.row(table); 306 | this.fieldlist(table, tpList, this.ar, "ar", table).width(85); 307 | if(this.ar == 1 || this.ar == 3){ 308 | //angle,lookat 309 | this.field(table, this.at, text => {this.at = text}).width(85); 310 | } 311 | else if(this.ar == 2){ 312 | this.row(table); 313 | this.fields(table, "x", this.at, text => {this.at = text}); 314 | this.fields(table, "y", this.av, text => {this.av = text}); 315 | } 316 | break; 317 | 318 | case 1: 319 | //damage 320 | this.field(table, this.atype, text => {this.atype = text}).width(85); 321 | this.row(table); 322 | this.fields(table, "amount", this.ax, text => {this.ax = text}); 323 | this.fieldlist(table, damageList, this.ay, "ay", table).width(85); 324 | break; 325 | 326 | case 2: 327 | //kill 328 | this.field(table, this.atype, text => {this.atype = text}).width(85); 329 | break; 330 | 331 | case 3: 332 | //give 333 | this.field(table, this.atype, text => {this.atype = text}).width(85); 334 | this.row(table); 335 | this.fields(table, "item", this.ax, text => {this.ax = text}); 336 | this.row(table); 337 | this.fields(table, "amount", this.ay, text => {this.ay = text}); 338 | this.fieldlist(table, giveList, this.ar, "ar", table).width(85); 339 | break; 340 | 341 | case 4: 342 | //clear 343 | this.field(table, this.atype, text => {this.atype = text}).width(85); 344 | break; 345 | 346 | case 5: 347 | //effect 348 | this.field(table, this.atype, text => {this.atype = text}).width(85); 349 | this.row(table); 350 | this.fields(table, "status", this.ax, text => {this.ax = text}); 351 | this.fieldlist(table, effectList, this.ay, "ay", table).width(85); 352 | if(this.ay == 0){ 353 | this.row(table); 354 | this.fields(table, "ticks", this.ar, text => {this.ar = text}); 355 | } 356 | break; 357 | 358 | case 6: 359 | //team 360 | this.field(table, this.atype, text => {this.atype = text}).width(85); 361 | this.row(table); 362 | this.fields(table, "team", this.ax, text => {this.ax = text}); 363 | break; 364 | 365 | case 7: 366 | //bind 367 | this.row(table); 368 | this.fields(table, "player", this.atype, text => {this.atype = text}).width(85); 369 | this.row(table); 370 | this.fields(table, "unit", this.ax, text => {this.ax = text}); 371 | break; 372 | 373 | default: 374 | this.row(table); 375 | table.add("[lightgray]invalid command[]"); 376 | } 377 | 378 | }, 379 | 380 | fieldlist(table, list, def, defname, parent){ 381 | var b = new Button(Styles.logict); 382 | //var n = Number(def); 383 | //if(isNaN(n) || n < 0 || n >= list.length) this[defname] = 0; 384 | b.label(prov(() => ((defname == "cmd")?"/":"") + list[Number(def)])); 385 | b.clicked(() => this.showSelect(b, list, list[Number(def)], t => { 386 | this[defname] = list.indexOf(t); 387 | if(parent !== false) this.buildt(parent); 388 | }, 2, cell => cell.size(100, 50))); 389 | return table.add(b).size(120, 40).color(table.color).left().padLeft(2); 390 | }, 391 | 392 | write(builder) { 393 | builder.append("cmdentity " + cmdList[this.cmd] + ""); 394 | builder.append(" "); 395 | builder.append(this.atype + ""); 396 | builder.append(" "); 397 | builder.append(this.ax + ""); 398 | builder.append(" "); 399 | builder.append(this.ay + ""); 400 | builder.append(" "); 401 | builder.append(this.ar + ""); 402 | builder.append(" "); 403 | builder.append(this.at + ""); 404 | builder.append(" "); 405 | builder.append(this.av + ""); 406 | }, 407 | 408 | name: () => "Command: Entity", 409 | color: () => cmdCategory 410 | }; 411 | 412 | /* Mimic @RegisterStatement */ 413 | LAssembler.customParsers.put("cmdentity", func(EntityStatement.new)); 414 | 415 | LogicIO.allStatements.add(prov(() => EntityStatement.new([ 416 | "cmdentity", 417 | "0", 418 | "unit", 419 | "0", 420 | "0", 421 | "0", 422 | "0", 423 | "0" 424 | ]))); 425 | -------------------------------------------------------------------------------- /scripts/commands/set.js: -------------------------------------------------------------------------------- 1 | const cmdList = ["setblock", "setfloor", "setoverlay", "fill", "clone"]; 2 | const modeList = ["replace", "keep", "destroy", "force"]; 3 | 4 | const cmdCategory = this.global.cmdCategory; 5 | 6 | //partial credits to DeltaNedas 7 | const SetblockI = { 8 | _(builder, cmd, ax, ay, ab, ar, at, a1, a2, a3) { 9 | this.cmd = builder.var(cmd); 10 | this.ax = builder.var(ax); 11 | this.ay = builder.var(ay); 12 | this.ab = builder.var(ab); 13 | this.ar = builder.var(ar); 14 | this.at = builder.var(at); 15 | this.a1 = builder.var(a1); 16 | this.a2 = builder.var(a2); 17 | this.a3 = builder.var(a3); 18 | }, 19 | 20 | run(vm) { 21 | const cmd = vm.numi(this.cmd); 22 | 23 | var block = vm.obj(this.ab); 24 | var cx = vm.numi(this.ax); 25 | var cy = vm.numi(this.ay); 26 | 27 | if(block == null || vm.vars[this.ax].isobj || vm.vars[this.ay].isobj || cx < 0 || cy < 0 || cx >= Vars.world.width() || cy >= Vars.world.height()) return; 28 | if(!(block instanceof Block)) return; 29 | 30 | var tile = Vars.world.tile(cx, cy); 31 | if(tile == null) return; 32 | 33 | switch(cmd){ 34 | case 0: 35 | var team = Team.get(vm.numi(this.at)); 36 | var mode = vm.numi(this.a1); 37 | if(block.name == "air" && mode == 1) return; 38 | var rot = vm.numi(this.ar) % 4; 39 | if(rot < 0) rot += 4; 40 | if(tile.block() == block && (tile.build == null || (tile.build.team == team && (tile.build.rotation == rot ||(block instanceof Turret))))){ 41 | vm.setobj(this.a2, tile.build); 42 | return; 43 | } 44 | 45 | if(mode == 1 && !this.checkEmpty(tile, block.size)) return; 46 | if(mode == 2 && tile.build != null){ 47 | //break old block 48 | tile.build.kill(); 49 | if(block.name != "air") tile.setBlock(block, team, rot); 50 | tile = Vars.world.tile(cx, cy); 51 | vm.setobj(this.a2, tile.build); 52 | } 53 | else{ 54 | //setblock 55 | tile.setBlock(block, team, rot); 56 | tile = Vars.world.tile(cx, cy); 57 | vm.setobj(this.a2, tile.build); 58 | } 59 | break; 60 | default: 61 | 62 | //end 63 | } 64 | }, 65 | checkEmpty(tile, size){ 66 | if(size <= 1) return tile.block().name == "air"; 67 | var off = Mathf.floorPositive((size - 1)/2); 68 | var end = Mathf.floorPositive(size / 2); 69 | for(var i = -1*off; i <= end; i++){ 70 | for(var j = -1*off; j <= end; j++){ 71 | if(tile.nearby(i, j).block().name != "air") return false; 72 | } 73 | } 74 | return true; 75 | } 76 | }; 77 | 78 | const SetblockStatement = { 79 | new: words => { 80 | const st = extend(LStatement, Object.create(SetblockStatement)); 81 | st.read(words); 82 | return st; 83 | }, 84 | 85 | read(words) { 86 | this.cmd = (isNaN(Number(words[1]))) ? cmdList.indexOf(words[1]) : words[1]; 87 | this.ax = words[2]; 88 | this.ay = words[3]; 89 | this.ab = words[4]; 90 | this.ar = words[5]; 91 | this.at = words[6]; 92 | this.a1 = (this.cmd == 0) ? ((isNaN(Number(words[7]))) ? modeList.indexOf(words[7]) : words[7]) : words[7]; 93 | this.a2 = words[8]; 94 | this.a3 = words[9]; 95 | }, 96 | 97 | build(h) { 98 | if (h instanceof Table) { 99 | return this.buildt(h); 100 | } 101 | 102 | const inst = extend(LExecutor.LInstruction, Object.create(SetblockI)); 103 | inst._(h, this.cmd, this.ax, this.ay, this.ab, this.ar, this.at, this.a1, this.a2, this.a3); 104 | return inst; 105 | }, 106 | 107 | buildt(table) { 108 | //todo dropdown 109 | table.clearChildren();//this just sounds horrible 110 | 111 | 112 | switch(Number(this.cmd)){ 113 | case 0: 114 | case 1: 115 | case 2: 116 | table.table(cons(t => { 117 | t.left(); 118 | t.setColor(table.color); 119 | this.fieldlist(t, cmdList, this.cmd, "cmd", table); 120 | this.fields(t, "x", this.ax, text => {this.ax = text}); 121 | this.fields(t, "y", this.ay, text => {this.ay = text}); 122 | if(!LCanvas.useRows()){ 123 | t.left(); 124 | t.setColor(table.color); 125 | this.fields(t, "block", this.ab, text => {this.ab = text}); 126 | if(this.cmd == 0) this.fields(t, "rotation", this.ar, text => {this.ar = text}); 127 | } 128 | })).left(); 129 | 130 | if(LCanvas.useRows()){ 131 | this.row(table); 132 | table.table(cons(t => { 133 | t.left(); 134 | t.setColor(table.color); 135 | this.fields(t, "block", this.ab, text => {this.ab = text}); 136 | if(this.cmd == 0) this.fields(t, "rotation", this.ar, text => {this.ar = text}); 137 | })).left(); 138 | } 139 | 140 | if(this.cmd != 0) break; 141 | 142 | table.row(); 143 | 144 | table.table(cons(t => { 145 | t.left(); 146 | t.setColor(table.color); 147 | if(!LCanvas.useRows()) t.add().width(120); 148 | this.fields(t, "team", this.at, text => {this.at = text}); 149 | this.fieldlist(t, modeList, this.a1, "a1", table).width(85); 150 | this.row(t); 151 | this.fields(t, "building", this.a2, text => {this.a2 = text}).left(); 152 | })).left(); 153 | 154 | break; 155 | 156 | case 3: 157 | //fill(idk if yey or nay) 158 | this.fieldlist(table, cmdList, this.cmd, "cmd", table); 159 | break; 160 | case 4: 161 | //clone(shallow copy) 162 | this.fieldlist(table, cmdList, this.cmd, "cmd", table); 163 | break; 164 | 165 | default: 166 | this.fieldlist(table, cmdList, this.cmd, "cmd", table); 167 | this.row(table); 168 | table.add("[lightgray]invalid command[]"); 169 | } 170 | 171 | }, 172 | 173 | fieldlist(table, list, def, defname, parent){ 174 | var b = new Button(Styles.logict); 175 | //var n = Number(def); 176 | //if(isNaN(n) || n < 0 || n >= list.length) this[defname] = 0; 177 | b.label(prov(() => ((defname == "cmd")?"/":"") + list[Number(def)])); 178 | b.clicked(() => this.showSelect(b, list, list[Number(def)], t => { 179 | this[defname] = list.indexOf(t); 180 | if(parent !== false) this.buildt(parent); 181 | }, 2, cell => cell.size(100, 50))); 182 | return table.add(b).size(120, 40).color(table.color).left().padLeft(2); 183 | }, 184 | 185 | write(builder) { 186 | builder.append("cmdset " + cmdList[this.cmd] + ""); 187 | builder.append(" "); 188 | builder.append(this.ax + ""); 189 | builder.append(" "); 190 | builder.append(this.ay + ""); 191 | builder.append(" "); 192 | builder.append(this.ab + ""); 193 | builder.append(" "); 194 | builder.append(this.ar + ""); 195 | builder.append(" "); 196 | builder.append(this.at + ""); 197 | builder.append(" "); 198 | builder.append((this.cmd == 0) ? modeList[this.a1] + "" : (this.a1 + "")); 199 | builder.append(" "); 200 | builder.append(this.a2 + ""); 201 | builder.append(" "); 202 | builder.append(this.a3 + ""); 203 | }, 204 | 205 | name: () => "Command: Set", 206 | color: () => cmdCategory 207 | }; 208 | 209 | /* Mimic @RegisterStatement */ 210 | LAssembler.customParsers.put("cmdset", func(SetblockStatement.new)); 211 | 212 | LogicIO.allStatements.add(prov(() => SetblockStatement.new([ 213 | "cmdset", 214 | "setblock", 215 | "0", 216 | "0", 217 | "block", 218 | "0", 219 | "1", 220 | "0", 221 | "result", 222 | "0" 223 | ]))); 224 | -------------------------------------------------------------------------------- /scripts/get.js: -------------------------------------------------------------------------------- 1 | const contentList = ["block", "item", "unit", "liquid", "bullet", "effect", "status", "weather", "sound", "color"]; 2 | const typeList = ["name", "id"]; 3 | const colorTypeList = ["name", "hex", "rgb", "hsv"]; 4 | 5 | const soundArr = Object.keys(Sounds).filter(s => (typeof Sounds[s]) == "object").sort(); 6 | const arrc = Object.keys(Color).filter(s => (typeof Color[s]) == "object").sort(); 7 | const arrp = Object.keys(Pal).filter(s => (typeof Pal[s]) == "object").sort(); 8 | const fxArr = Object.keys(Fx).filter(s => (typeof Fx[s]) == "object"); 9 | 10 | //this.global.cmdCategory = LCategory.blocks; 11 | //const cmdCategory = this.global.cmdCategory; 12 | 13 | //partial credits to DeltaNedas 14 | const GetContI = { 15 | _(builder, res, cont, type, val, vg, vb) { 16 | this.res = builder.var(res); 17 | this.cont = builder.var(cont); 18 | this.type = builder.var(type); 19 | this.val = builder.var(val); 20 | this.vg = builder.var(vg); 21 | this.vb = builder.var(vb); 22 | }, 23 | 24 | run(vm) { 25 | const cont = Number(vm.numi(this.cont)); 26 | 27 | if((0 <= cont && cont < 4) || cont == 6 || cont == 7){ 28 | //getbyname & getbyid 29 | var type = vm.numi(this.type); 30 | vm.setobj(this.res, (type == 0) ? Vars.content.getByName(ContentType[contentList[cont]], vm.obj(this.val) + "") : Vars.content.getByID(ContentType[contentList[cont]], vm.numi(this.val))); 31 | } 32 | else if(cont == 4){ 33 | //Bullet 34 | var type = vm.numi(this.type); 35 | if(type == 0){ 36 | try{ 37 | vm.setobj(this.res, Bullets[vm.obj(this.val) + ""]); 38 | } 39 | catch(notFound){ 40 | vm.setobj(this.res, null); 41 | } 42 | } 43 | else vm.setobj(this.res, Vars.content.getByID(ContentType.bullet, vm.numi(this.val))); 44 | } 45 | else if(cont == 5){ 46 | vm.setobj(this.res, fxArr.indexOf(vm.obj(this.val) + "") > -1 ? vm.obj(this.val) : null); 47 | } 48 | else if(cont == 8){ 49 | //Sound, this is cheating ik 50 | var tmpid = 0; 51 | if(vm.numi(this.type) != 0) tmpid = vm.numi(this.val); 52 | else tmpid = soundArr.indexOf(vm.obj(this.val) + ""); 53 | if(tmpid < 0 || tmpid >= soundArr.length) vm.setobj(this.res, null); 54 | else vm.setobj(this.res, soundArr[tmpid]); 55 | } 56 | else if(cont == 9){ 57 | //Color 58 | var type = vm.numi(this.type); 59 | if(type == 0){ 60 | //name 61 | var color = vm.obj(this.val) + ""; 62 | try{ 63 | if(arrc.indexOf(color) > -1) vm.setobj(this.res, Color[color].toString()); 64 | else if(arrp.indexOf(color) > -1) vm.setobj(this.res, Pal[color].toString()); 65 | } 66 | catch(invalidColor){} 67 | } 68 | else if(type == 1){ 69 | var color = vm.obj(this.val) + ""; 70 | //if(color.length > 7 || color.length < 6) return;//ewww color 71 | try{ 72 | vm.setobj(this.res, Color.valueOf(color).toString()); 73 | } 74 | catch(invalidColor){} 75 | } 76 | else if(type == 2){ 77 | //rgb 78 | vm.setobj(this.res, Color.rgb(vm.numi(this.val), vm.numi(this.vg), vm.numi(this.vb)).toString()); 79 | } 80 | else if(type == 3){ 81 | //hsv 82 | vm.setobj(this.res, Tmp.c1.set(1, 1, 1, 1).fromHsv(vm.numi(this.val), vm.numi(this.vg), vm.numi(this.vb)).toString()); 83 | } 84 | } 85 | } 86 | }; 87 | 88 | const GetContStatement = { 89 | new: words => { 90 | const st = extend(LStatement, Object.create(GetContStatement)); 91 | st.read(words); 92 | return st; 93 | }, 94 | 95 | read(words) { 96 | this.res = words[1]; 97 | this.cont = (isNaN(Number(words[2]))) ? contentList.indexOf(words[2]) : words[2]; 98 | if(this.cont == 5) this.type = words[3]; 99 | else if(this.cont == 9) this.type = (isNaN(Number(words[3]))) ? colorTypeList.indexOf(words[3]) : words[3]; 100 | else this.type = (isNaN(Number(words[3]))) ? typeList.indexOf(words[3]) : words[3]; 101 | this.val = words[4]; 102 | this.vg = words[5]; 103 | this.vb = words[6]; 104 | }, 105 | 106 | build(h) { 107 | if (h instanceof Table) { 108 | return this.buildt(h); 109 | } 110 | 111 | const inst = extend(LExecutor.LInstruction, Object.create(GetContI)); 112 | inst._(h, this.res, this.cont, this.type, this.val, this.vg, this.vb); 113 | return inst; 114 | }, 115 | 116 | buildt(table) { 117 | //todo dropdown 118 | table.clearChildren();//this just sounds horrible 119 | 120 | table.table(cons(t => { 121 | t.left(); 122 | t.setColor(table.color); 123 | this.field(t, this.res, text => {this.res = text}).width(85); 124 | t.add(" = "); 125 | this.fieldlist(t, contentList, this.cont, "cont", table, 120); 126 | })).left(); 127 | 128 | this.row(table); 129 | 130 | if(this.cont == 9){ 131 | table.table(cons(t => { 132 | t.left(); 133 | t.setColor(table.color); 134 | t.add(" getby"); 135 | this.fieldlist(t, colorTypeList, this.type, "type", table, 85); 136 | if(this.type == 0 || this.type == 1){ 137 | //if(this.type == 1) table.add(" #"); 138 | this.field(t, this.val, text => {this.val = text}).width(180).left(); 139 | } 140 | })).left(); 141 | 142 | this.row(table); 143 | 144 | if(this.type == 2){ 145 | table.table(cons(t => { 146 | t.left(); 147 | t.setColor(table.color); 148 | this.fields(t, "r", this.val, text => {this.val = text}); 149 | this.fields(t, "g", this.vg, text => {this.vg = text}); 150 | this.fields(t, "b", this.vb, text => {this.vb = text}); 151 | })).left(); 152 | } 153 | else if(this.type == 3){ 154 | table.table(cons(t => { 155 | t.left(); 156 | t.setColor(table.color); 157 | this.fields(t, "h", this.val, text => {this.val = text}); 158 | this.fields(t, "s", this.vg, text => {this.vg = text}); 159 | this.fields(t, "v", this.vb, text => {this.vb = text}); 160 | })).left(); 161 | } 162 | } 163 | else{ 164 | table.table(cons(t => { 165 | t.left(); 166 | t.setColor(table.color); 167 | t.add(" getby"); 168 | if(this.cont == 5) this.fakelist(t, "name", 85); 169 | else this.fieldlist(t, typeList, this.type, "type", table, 85); 170 | //this.row(table); 171 | this.field(t, this.val, text => {this.val = text}).width(180); 172 | })).left(); 173 | } 174 | }, 175 | 176 | fieldlist(table, list, def, defname, parent, w){ 177 | var b = new Button(Styles.logict); 178 | //var n = Number(def); 179 | //if(isNaN(n) || n < 0 || n >= list.length) this[defname] = 0; 180 | b.label(prov(() => ((defname == "cmd")?"/":"") + list[Number(def)])); 181 | b.clicked(() => this.showSelect(b, list, list[Number(def)], t => { 182 | this[defname] = list.indexOf(t); 183 | if(parent !== false) this.buildt(parent); 184 | }, 2, cell => cell.size(100, 50))); 185 | table.add(b).size(w, 40).color(table.color).left().padLeft(2); 186 | }, 187 | 188 | fakelist(table, name, w){ 189 | var b = new Button(Styles.logict); 190 | b.label(prov(() => name)); 191 | b.clicked(() => {}); 192 | table.add(b).size(w, 40).color(table.color).left().padLeft(2); 193 | }, 194 | 195 | write(builder) { 196 | builder.append("getcont " + this.res + ""); 197 | builder.append(" "); 198 | builder.append(contentList[this.cont] + ""); 199 | builder.append(" "); 200 | if(this.cont == 5) builder.append("name"); 201 | else if(this.cont == 9) builder.append(colorTypeList[this.type] + ""); 202 | else builder.append(typeList[this.type] + ""); 203 | 204 | builder.append(" "); 205 | builder.append(this.val + ""); 206 | builder.append(" "); 207 | builder.append(this.vg + ""); 208 | builder.append(" "); 209 | builder.append(this.vb + ""); 210 | }, 211 | 212 | name: () => "Get Content", 213 | color: () => Pal.logicOperations 214 | }; 215 | 216 | /* Mimic @RegisterStatement */ 217 | LAssembler.customParsers.put("getcont", func(GetContStatement.new)); 218 | 219 | LogicIO.allStatements.add(prov(() => GetContStatement.new([ 220 | "getcont", 221 | "result", 222 | "0", 223 | "0", 224 | '""', 225 | "0", 226 | "0" 227 | ]))); 228 | -------------------------------------------------------------------------------- /scripts/main.js: -------------------------------------------------------------------------------- 1 | this.global.commands = {}; 2 | 3 | require("cmd/commands/action"); 4 | require("cmd/commands/create");//listify done 5 | require("cmd/commands/entity"); 6 | require("cmd/commands/set");//listify done for now 7 | 8 | require("cmd/world");//listify done 9 | 10 | require("cmd/get");//listify done 11 | require("cmd/tostring");//listify done 12 | 13 | //require("cmd/rainbow"); 14 | -------------------------------------------------------------------------------- /scripts/rainbow.js: -------------------------------------------------------------------------------- 1 | //partial credits to DeltaNedas 2 | const UselessI = { 3 | _(builder, res, cont) { 4 | this.res = builder.var(res); 5 | this.cont = builder.var(cont); 6 | }, 7 | 8 | run(vm) { 9 | //vm.setobj(this.res, vm.obj(this.cont) + ""); 10 | } 11 | }; 12 | 13 | const UselessStatement = { 14 | new: words => { 15 | const st = extend(LStatement, Object.create(UselessStatement)); 16 | st.read(words); 17 | return st; 18 | }, 19 | 20 | read(words) { 21 | this.res = words[1]; 22 | this.cont = words[2]; 23 | }, 24 | 25 | build(h) { 26 | if (h instanceof Table) { 27 | return this.buildt(h); 28 | } 29 | 30 | const inst = extend(LExecutor.LInstruction, Object.create(UselessI)); 31 | inst._(h, this.res, this.cont); 32 | return inst; 33 | }, 34 | 35 | buildt(table) { 36 | //todo dropdown 37 | table.clearChildren();//this just sounds horrible 38 | 39 | //this.field(table, this.res, text => {this.res = text}).width(90); 40 | table.add("???"); 41 | //this.fields(table, "?", this.cont, text => {this.cont = text}); 42 | }, 43 | 44 | write(builder) { 45 | builder.append("owo " + this.res + ""); 46 | builder.append(" "); 47 | builder.append(this.cont + ""); 48 | }, 49 | 50 | name: () => "Rainbow!", 51 | color: () => Tmp.c1.set(1, 1, 1, 1).fromHsv((Time.time() * 3)%360, 1, 1) 52 | }; 53 | 54 | /* Mimic @RegisterStatement */ 55 | LAssembler.customParsers.put("owo", func(UselessStatement.new)); 56 | 57 | LogicIO.allStatements.add(prov(() => UselessStatement.new([ 58 | "owo", 59 | "", 60 | "" 61 | ]))); 62 | -------------------------------------------------------------------------------- /scripts/tostring.js: -------------------------------------------------------------------------------- 1 | //partial credits to DeltaNedas 2 | const ToStrI = { 3 | _(builder, res, cont) { 4 | this.res = builder.var(res); 5 | this.cont = builder.var(cont); 6 | }, 7 | 8 | run(vm) { 9 | var h = vm.obj(this.cont); 10 | if(h == null && !Mathf.zero(vm.num(this.cont))) h = vm.num(this.cont); 11 | vm.setobj(this.res, (h == null || (typeof h) != "object") ? h + "" : ((typeof h.toString) == "function" ? h.toString() : h + "")); 12 | } 13 | }; 14 | 15 | const ToStrStatement = { 16 | new: words => { 17 | const st = extend(LStatement, Object.create(ToStrStatement)); 18 | st.read(words); 19 | return st; 20 | }, 21 | 22 | read(words) { 23 | this.res = words[1]; 24 | this.cont = words[2]; 25 | }, 26 | 27 | build(h) { 28 | if (h instanceof Table) { 29 | return this.buildt(h); 30 | } 31 | 32 | const inst = extend(LExecutor.LInstruction, Object.create(ToStrI)); 33 | inst._(h, this.res, this.cont); 34 | return inst; 35 | }, 36 | 37 | buildt(table) { 38 | //todo dropdown 39 | table.clearChildren();//this just sounds horrible 40 | 41 | this.field(table, this.res, text => {this.res = text}).width(90); 42 | table.add(" = "); 43 | this.fields(table, "toString", this.cont, text => {this.cont = text}); 44 | }, 45 | 46 | write(builder) { 47 | builder.append("tostring " + this.res + ""); 48 | builder.append(" "); 49 | builder.append(this.cont + ""); 50 | }, 51 | 52 | name: () => "To String", 53 | color: () => Pal.logicOperations 54 | }; 55 | 56 | /* Mimic @RegisterStatement */ 57 | LAssembler.customParsers.put("tostring", func(ToStrStatement.new)); 58 | 59 | LogicIO.allStatements.add(prov(() => ToStrStatement.new([ 60 | "tostring", 61 | "result", 62 | "" 63 | ]))); 64 | -------------------------------------------------------------------------------- /scripts/world.js: -------------------------------------------------------------------------------- 1 | const typeList = ["building", "block", "overlay", "floor", "width", "height", "solid?", "passable?", "synthetic?", "drop"];//? hopefully implies boolean 2 | 3 | //partial credits to DeltaNedas 4 | const GetWorldI = { 5 | _(builder, res, type, ax, ay) { 6 | this.res = builder.var(res); 7 | this.type = builder.var(type); 8 | this.ax = builder.var(ax); 9 | this.ay = builder.var(ay); 10 | }, 11 | 12 | run(vm) { 13 | var type = vm.numi(this.type); 14 | switch(type){ 15 | case 4: 16 | vm.setnum(this.res, Vars.world.width()); 17 | break; 18 | case 5: 19 | vm.setnum(this.res, Vars.world.height()); 20 | break; 21 | 22 | case 0: 23 | vm.setobj(this.res, Vars.world.build(vm.numi(this.ax), vm.numi(this.ay))); 24 | break; 25 | case 1: 26 | var tile = Vars.world.tile(vm.numi(this.ax), vm.numi(this.ay)); 27 | vm.setobj(this.res, (tile == null) ? null : tile.block()); 28 | break; 29 | case 2: 30 | var tile = Vars.world.tile(vm.numi(this.ax), vm.numi(this.ay)); 31 | vm.setobj(this.res, (tile == null) ? null : tile.overlay()); 32 | break; 33 | case 3: 34 | var tile = Vars.world.tile(vm.numi(this.ax), vm.numi(this.ay)); 35 | vm.setobj(this.res, (tile == null) ? null : tile.floor()); 36 | break; 37 | 38 | case 6: 39 | vm.setbool(this.res, Vars.world.solid(vm.numi(this.ax), vm.numi(this.ay))); 40 | break; 41 | case 7: 42 | vm.setbool(this.res, Vars.world.passable(vm.numi(this.ax), vm.numi(this.ay))); 43 | break; 44 | 45 | case 8: 46 | var tile = Vars.world.tile(vm.numi(this.ax), vm.numi(this.ay)); 47 | vm.setbool(this.res, (tile == null) ? false : tile.synthetic()); 48 | break; 49 | case 9: 50 | var tile = Vars.world.tile(vm.numi(this.ax), vm.numi(this.ay)); 51 | vm.setobj(this.res, (tile == null) ? null : tile.drop()); 52 | break; 53 | } 54 | } 55 | }; 56 | 57 | const GetWorldStatement = { 58 | new: words => { 59 | const st = extend(LStatement, Object.create(GetWorldStatement)); 60 | st.read(words); 61 | return st; 62 | }, 63 | 64 | read(words) { 65 | this.res = words[1]; 66 | this.type = (isNaN(Number(words[2]))) ? typeList.indexOf(words[2]) : words[2]; 67 | this.ax = words[3]; 68 | this.ay = words[4]; 69 | }, 70 | 71 | build(h) { 72 | if (h instanceof Table) { 73 | return this.buildt(h); 74 | } 75 | 76 | const inst = extend(LExecutor.LInstruction, Object.create(GetWorldI)); 77 | inst._(h, this.res, this.type, this.ax, this.ay); 78 | return inst; 79 | }, 80 | 81 | buildt(table) { 82 | table.clearChildren(); 83 | 84 | table.table(cons(t => { 85 | t.left(); 86 | t.setColor(table.color); 87 | this.field(t, this.res, text => {this.res = text}).width(85); 88 | t.add(" = "); 89 | this.fieldlist(t, typeList, this.type, "type", table).width(120); 90 | })).left(); 91 | 92 | if(this.type == 4 || this.type == 5) return; 93 | 94 | this.row(table); 95 | table.table(cons(t => { 96 | t.left(); 97 | t.setColor(table.color); 98 | this.fields(t, "x", this.ax, text => {this.ax = text}); 99 | this.fields(t, "y", this.ay, text => {this.ay = text}); 100 | })).left(); 101 | }, 102 | 103 | fieldlist(table, list, def, defname, parent){ 104 | var b = new Button(Styles.logict); 105 | b.label(prov(() => ((defname == "cmd")?"/":"") + list[Number(def)])); 106 | b.clicked(() => this.showSelect(b, list, list[Number(def)], t => { 107 | this[defname] = list.indexOf(t); 108 | if(parent !== false) this.buildt(parent); 109 | }, 2, cell => cell.size(100, 50))); 110 | return table.add(b).size(85, 40).color(table.color).left().padLeft(2); 111 | }, 112 | 113 | fakelist(table, name){ 114 | var b = new Button(Styles.logict); 115 | b.label(prov(() => name)); 116 | b.clicked(() => {}); 117 | return table.add(b).size(85, 40).color(table.color).left().padLeft(2); 118 | }, 119 | 120 | write(builder) { 121 | builder.append("world " + this.res + ""); 122 | builder.append(" "); 123 | builder.append(typeList[this.type] + ""); 124 | builder.append(" "); 125 | builder.append(this.ax + ""); 126 | builder.append(" "); 127 | builder.append(this.ay + ""); 128 | }, 129 | 130 | name: () => "World", 131 | color: () => Pal.logicBlocks 132 | }; 133 | 134 | /* Mimic @RegisterStatement */ 135 | LAssembler.customParsers.put("world", func(GetWorldStatement.new)); 136 | 137 | LogicIO.allStatements.add(prov(() => GetWorldStatement.new([ 138 | "world", 139 | "result", 140 | "building", 141 | "0", 142 | "0" 143 | ]))); 144 | --------------------------------------------------------------------------------