How To: Autocode to LunaLua
From PGE Wiki
This is a guide for converting LunaDLL autocode to LunaLua code. Note that this guide is still incomplete; please refer to the LunaDLL Autocode Reference and LunaLua API for commands and functions not yet featured here.
- The player2 keyword can be substituted for player to apply any filters/behavior/etc. to the second player instead of the first.
- Some autocode commands do not have a LunaLua equivalent yet or do not require a LunaLua equivalent due to differences in how code is structured in the two languages.
player.powerup = PLAYER_SMALL;
|Player loses all powerups.|
if player.powerup ~= PLAYER_SMALL then player.powerup = PLAYER_BIG; end
|Lowers player 1's powerup state down to "bigness" if they have anything better (fire flower, leaf...)|
If you are already small or big, you will stay small or big.
if player.powerup > PLAYER_FIREFLOWER-1 then player.powerup = PLAYER_FIREFLOWER; end
|Lowers player 1's powerup state down to fire flower if they have anything better (leaf, hammer suit...)|
If you are already small, big, or fire-flowered, you will stay that way.
You can use another powerup constant in place of PLAYER_FIREFLOWER to filter to that powerup instead.
player:mem(0x108, FIELD_WORD, 0);
|Removes your mount (yoshi, clown car, boot...)|
player.reservePowerup = 0;
|Removes whatever is in the reserve powerup box.|
Replace the 0 with another NPC ID to place that NPC in the reserve box.
-- Pre-v0.7.2 if player:mem(0xF0, FIELD_WORD) == P1 then player:mem(0xF0, FIELD_WORD, P2); end -- 0.7.2 and up if player.character == P1 then player.character = P2 end
|If the player is P1, change them to P2 instead. Replace P1 and P2 with the player constants of your choice.|
To filter all other characters to P2, just use the middle line.
General Effect Commands
|HeartSystem,X,Y,MAX HEARTS,-,Active time,-||Suggested library||Activates a heart tracking system for players that use hearts. Allows for more than 3 hearts and displays the current heart count at X / Y on screen.|
player:mem(0x170,FIELD_WORD) = 52;
|Keeps the player's flight timer from counting down.|
for k,v in pairs(NPC.get(NPC ID, Section-1)) do v.direction = DIR_RIGHT; if player.x < v.x then v.direction = DIR_LEFT; end end
|All NPCs of NPC ID in Section always face the player.|
-- v0.7.2 and up local spdX = # local spdY = # local boundaryRect = Section.get(#).boundary boundaryRect.left = boundaryRect.left + spdX boundaryRect.right = boundaryRect.right + spdX boundaryRect.top = boundaryRect.top + spdY boundaryRect.bottom = boundaryRect.bottom + spdY
|Moves section borders.|
|ScreenEdgeBuffer,NPC ID,UDLR,Buffer Space,-,Length,-||
local cam = Camera.get() local lMargin = cam.x - # local rMargin = cam.x + cam.width + # local tMargin = cam.y - # local bMargin = cam.y + cam.height + # for k,v in pairs (NPC.get()) do if v.x < lMargin then v.x = lMargin end if v.x > rMargin then v.x = rMargin end if v.y < tMargin then v.y = tMargin end if v.y > bMargin then v.y = bMargin end end
|Keeps NPCs from leaving the screen.|
|Interrupts words and cheats the player is typing.|
|ShowText,-,X pos,Y pos,Font type,Length,String||
Text.print(String, Font type, X pos, Y pos)
|Shows String on the screen, at coordinates Xpos and Y pos, with specified font type.|
|ShowNPCLifeLeft,NPC ID,X pos,Y pos,Section,Length,Base health||
local npc = NPC.get(NPC ID, Section) local hpStr = "HP: "..tostring(npc:mem(0x148,FIELD_FLOAT)).."/"..tostring(Base health) Text.print(hpStr, X pos, Y pos)
|Displays how much life the first match for "NPC ID" in "Section" has. Displays on the screen at coordinates X pos and Y pos. Supply the correct base health for the NPC so it can calculate the correct remaining life.|
-- Pre-0.7.2 if player:mem(0xF0, FIELD_WORD) == CHARACTER_MARIO then player:mem(0xF0, FIELD_WORD, CHARACTER_LINK); else local temp = player:mem(0xF0, FIELD_WORD) - 1; player:mem(0xF0, FIELD_WORD, temp); end -- 0.7.2 and up if player.character == CHARACTER_MARIO then player.character = CHARACTER_LINK; else player.character = player.character - 1; end
|Cycles player character 'left'.|
-- Pre-0.7.2 local temp = math.max(1,(player:mem(0xF0, FIELD_WORD) + 1)%6); player:mem(0xF0, FIELD_WORD, temp); -- 0.7.2 and up local temp = math.max(1, (player.character+1)%6); player.character = temp;
|Cycles player character 'right'.|
|Kills the target.|
mem(Address, Data type, Value)
|Sets the internal memory of SMBX.|
|NPCMemSet,NPC ID,Offset,Value,OPERATION,Length,Data type||
for k,v in pairs(NPC.get(NPC ID, -1)) do NPC:mem(Address, Data type, Value); end
|Sets the memory of all NPCs in the level of the given type.|
player:mem(Offset, Data type, Value)
|Sets the memory of Player 1.|
player:mem(0x16, FIELD_WORD, Hearts)
|Sets the amount of hearts the player currently has to HEARTS.|
for k,v in pairs(NPC.get(NPC ID, -1)) do NPC:mem(0x148, FIELD_FLOAT, Damage); end
|Set all NPCs that have the given NPCID to have taken HITS amount of hits.|
|SetVar,-,Operation,Value,-,Length,Variable Name||See the Data class||Manipulates permanent user variables|
Audio.playSFX(int SoundID) // or Audio.playSFX(string Filename)
|Plays one of SMBX's sound effects if you specify a number or a custom sound effect from the level folder if you specify a filename string.|
|Plays the music from Section.|