Discuss Scratch

Apfellord
Scratcher
100+ posts

Official Monster World modding thread



Hello Monster World-modders and everyone interested in becoming one!
Welcome to the official Monster World preview-version modding thread
(always work in progress)

If you're here, that means that you either already played Monster World (in which case - thank you),
or found this thread randomly in the list of discussions, in which case you might want to check out Monster World before continuing to read:

Link to the project page on the Scratch website

Have you played the game enough by now that fighting the same enemies and using the same abilities has become stale?
Do you have a really cool idea that Apfellord isn't intending on adding yet?
Or do you just want to make a super overpowered version of the game so you can finally beat the hardcore challenge?

No matter what fuels your interested to mod the game, this thread is the place to find out how and then share your remixes!

Other Monster World discussion threads:


Table of contents:
  1. Changing basic stat values
  2. Adding enemies
  3. Adding new abilities
  4. Adding Status effects (not yet written)
  5. Other random info

1. Changing basic stat values
Changing values like health, energy, level, gold and exp is really simple, because they're mostly defined by one or two variables.
Most of these variables' names start with “Player_” and are reset whenever the stage receives the broadcast “general_runstart”.

Full list of stat variable names and what they define:

(Player_Level)
Defines the current level of the player (changing this variable is mostly useless because stat points are only gained when “player_levelup” is broadcasted)

(Player_MaxExp)
Defines the maximum amount of exp you need to level up

(Player_CurExp)
Defines the current amount of exp you have (changing this directly to a value that is higher than MaxExp won't trigger a level up until you gain more Exp naturally through the variable below)

(Script_GainedExp)
Whenever this variable's value is above 0, the game will start to decrease it by 1 and increase “Player_CurExp” by 1. If through this CurExp would reach MaxExp, “player_levelup” is broadcasted.

(Player_MaxHP)
Defines the maximum amount of Health the player has.

(Player_CurrentHP)
Defines the current amount of Health the player has. (Setting this to 0 won't trigger defeat until damage is taken naturally - through an enemy attack or an ability)

(Player_Block)
Defines the amount of block you have.

(Player_MaxEnergy)
Defines the maximum amount of Energy the player holds. At the start of your turn, your energy will be replenished to be equal to this variable's value.

(Player_CurrentEnergy)
Defines the current amount of Energy you have.

(Player_GoldAmount)
Defines the amount of Gold you have.

(Player_StartingCardAmount)
Defines the amount of abilities you draw at the start of each turn.

(Battle_HandSize)
Defines the amount of abilities you can hold in your hand (any value above 7 will not only make cards go over the draw- and discard pile buttons, but will also probably break some things)

Modifying player stats (Attack, Dexterity, Intellect and Health):
The player's stats are hidden inside the List “Player_Stats_Data”. Each item of the list holds their own value for a respective stat.
(item (1 v) of [Player_Stats_Data v] :: list)
Defines how many stat points you still have left to spend.

(item (2 v) of [Player_Stats_Data v] :: list)
Defines your Attack stat.

(item (3 v) of [Player_Stats_Data v] :: list)
Defines your Dexterity stat.

(item (4 v) of [Player_Stats_Data v] :: list)
Defines your Intellect stat.

(item (5 v) of [Player_Stats_Data v] :: list)
Defines your Health stat.

You can edit these values using the
replace item ( v) of [Player_Stats_Data v] with []
(Changing the values of stats directly through this method won't trigger learning new abilities or increase your maximum health, but does enable the passive effects of having 5 or more points in a specific stat)

Modifying status effects of the player and enemies (Weakness, Vulnerability, Strength,…):
Status effect information is stored inside the lists “Player_StatusList” and “Enemy_StatusList” for the player and each enemy respectively.
Keep in mind that “Enemy_StatusList” is a local list, meaning it's unique for every enemy clone. If you use a block to edit it, that block has to be run by the respective enemy clone so that it changes its own list.

Every item in the StatusList represents the value of a specific status effect. You can find a note in the stage sprite containing the number of every status effect. Again, you can use the “replace item of list”-block to change the values of the status effects. The maximum value a status effect can have is 49 (minimum value is -49).




2. Adding enemies
First of all, huge thanks to @Black_Robot_Satin for pretty much writing this whole part!

Fortunately MW is very modular and enemies can be added without scripting every single action the enemy sprite has to do!

a) Preparation:
We will be staying in the enemy sprite for this entire tutorial.
So, let's assume that we want to add an enemy called “Pete”.
Pete is an Elite enemy, has 70 HP and gives you 60 EXP points.

To define Pete's stats add an element to each of these lists:
(the order of the elements is important, so be sure to add them as the last element in the list)

add [Pete] to [Script_EnemyNames v]
add [70] to [Script_EnemyHPValues v]
add [2] to [Script_EnemyHPBarSizes v]
Side note for HPBarSizes:
4=Boss HP Bar (needs to be hard-coded for now) | 3=Small HP Bar | 2=Medium HP Bar | 1=Large HP Bar
Currently, no enemy uses the small HP Bar. Most standard enemies have medium-sized HP Bars, while Elites have Large HP Bars.
Because Pete is an elite, we add the element “2”, so a large HP bar.


add [60] to [Script_EnemyEXPValues v]
add [20] to [Script_EnemyHeights v]
Side note for EnemyHeights:
This really depends on the enemy sprite size and defines how high the enemy intent-icon floats above the enemy. Currently, this ranges from -20 (for small enemies like Pykers) to 55 (for huge boss-sprites or flying enemies like Mantical Swarmers)


You also have to add your enemy costumes to the “Enemies”-sprite.
The naming of these costumes is very important and usually looks like this: E_001_Idle1
Because there are currently 30 enemies in Monster World (at the time this post was created), Pete's ID will be 31.
Important: Make sure you don't use the same ID for two enemies.

As you might have already seen in the above example, enemy IDs always have to have 3 digits,
so the first animation frame of Pete will be called E_031_Idle1, the second will be called E_031_Idle2 and so on…
(The current maximum amount of frames an enemy animation can have is 4.
If your enemy doesn't have any animations, that's fine. All you have to do is add the Idle1 frame in that case.)


b) Making your enemy spawn:
Enemies get instantiated (created) in the “SpawnEnemies” Custom Block.
Here, in order to spawn an enemy, the script does the following things in this order:
1. It adds the Enemy ID to the list “Battle_Turns” (E_031 in our case)
2. It changes the value of the “Script_Numberkeeper” variable to the length of the list “Battle_Turns”
3. It switches to the costume “StartingCostume_Enemy”
4. It creates a clone (which then knows what enemy it is and on what turn it has to act based on the info we just gave it)

add [E_(your enemy index number)] to [Battle_Turns v]
set [ Script_NumberKeeper v] to (length of [ Battle_Turns v] :: list)
switch costume to [StartingCostume_Enemy v]
create clone of [myself v]


If you want your enemy to spawn in an existing location (e.g. F_Grassland), go to the if-statement corresponding to that location.
First, we have to define the Random number generator script (RNG), because the game has to decide which Grassland enemies you encounter.
The reason this is done in such a complicated manner is because the game works through a seeded RNG system, not the “pick random () to ()” script.

If the location had five possible enemy setups previously,
 set [Script_NK3 v] to ((((item ( 1) of [RNG_Moduli v] :: list) mod (101)) mod (5)) + (1)) 
the block should look like this now, so you can add your own enemy setup (5 was changed to 6 - there are 6 different outcomes now).
 set [Script_NK3 v] to ((((item ( 1) of [RNG_Moduli v] :: list) mod (101)) mod (6)) + (1)) 
This block gives Script_NK3 (a simple “numberkeeper”-variable) a random value between one and the number we just changed (6).

Now add another if-else-statement to the tree of if-else-statements with the parameter <Script_NK3 = 6> (the sixth outcome we just added) and add these blocks into the if-else-statement:
 
previous blocks...
if <(Script_NK3) = [5]> then
here are the blocks for summoning a slime and a neitro
else
if <(Script_NK3) = [6]> then
wait (0.1) secs
add [E_(the index of your enemy)] to [Battle_Turns v]
set [ Script_NumberKeeper v] to (length of [Battle_Turns v] :: list)
switch costume to [ StartingCostume_Enemy v]
create clone of [ myself v]
end
end


If you want your enemy to spawn in a custom location, go to the bottom of the custom block script and add a new if-statement with the parameter
<(Map_CurrentAction) = [B_YourCustomLocationName]>
and add these blocks into the if-statement:

if <(Map_CurrentAction) = [B_YourCustomLocationName]> then
add [E_(your enemy index number)] to [Battle_Turns v]
set [ Script_NumberKeeper v] to (length of [ Battle_Turns v] :: list)
switch costume to [StartingCostume_Enemy v]
create clone of [myself v]
end


Side information for Map_CurrentAction possibilities:
B_ stands for a Boss enemy.
E_ stands for an elite fight. (always spawns a chest with an item inside after the battle)
F_ stands for the default fight.
Q_ stands for an unknown action. (triggers an event)
S_ stands for the shop.
I_ stands for the Inn.




c) Status effect on spawn:
If you want your new enemy to have a Status effect on it at the start of the battle,
go to the “DefineEnemyStats” custom block and add an if-statement with the parameter
“Enemy_ID” = (ID of your new enemy)".
Inside the if-statement, put in these blocks:

if <(Enemy_ID) = [E_{index of your enemy}]> then
replace item [{Status effect-Number}] of [Enemy_StatusList v] with [{value of the status effect}]
end

The first number represents the Status effect. There is a list of all status effect names and their index
numbers in the Stage sprite.

d) Defining enemy intents:

Now we need to define the intent pattern of our enemy.
Go to the “DefineEnemyIntent” custom block and add a new if-statement with the parameter “Enemy_IDShortened = (Index of your new enemy without any extra zeros (so 031 => 31 and 002 => 2)”.

An enemy always acts in a certain pattern. Different enemies have different pattern lengths.
Let's look at an attack pattern of an existing enemy: the slime.
 if <(Enemy_IDShortened) = [1]> then 
set [ Enemy_IntentEffectAnim] to [003]
if <(((Enemy_PlayedTurns) + (Enemy_TurnNumber)) mod (3)) = [0]> then
set [ Enemy_IntentName] to [Attack]
set Enemy_IntentValue to random between [4] and [6]
else
if <(((Enemy_PlayedTurns) + (Enemy_TurnNumber)) mod (3)) = [1]> then
set [ Enemy_IntentName] to [Block]
set Enemy_IntentValue to random between [4] and [6]
else
if <(((Enemy_PlayedTurns) + (Enemy_TurnNumber)) mod (3)) = [2]> then
set [ Enemy_IntentName] to [Attack]
set Enemy_IntentValue to random between [4] and [6]
end
end
end
end

the if-else-tree shows all the different actions this enemy will take.
  • The slime will first attack with a power of 4 to 6
  • then it will block with a power of 4 to 6
  • and finally it will attack again with a power of 4 to 6.
after that, it will start this loop again.

Here are all the different Intents an enemy can have and how to define them:

Attack:
set [ Enemy_IntentName v] to [Attack]
set Enemy_IntentValue to random between [(minimum attack power)] and [(maximum attack power)]

Block:
set [ Enemy_IntentName v] to [Block]
set Enemy_IntentValue to random between [(minimum block power)] and [(maximum block power)]

Debuff_Attack:

Applying status effects:
set [ Enemy_IntentName v] to [Debuff_Attack]
set Enemy_IntentValue to random between [(minimum attack power)] and [(maximum attack power)]
set [ Enemy_IntentInfo v] to [(name of the status effect that is given to the player)]
set [ Enemy_IntentValue2 v] to [(strength of the status effect)]

Attacking and adding Abilities to the player's Draw Pile:
set [ Enemy_IntentName v] to [Debuff_Attack]
set Enemy_IntentValue to random between [(minimum attack power)] and [(maximum attack power)]
set [ Enemy_IntentInfo v] to [AddCard]
set [ Enemy_IntentInfo2 v] to [Ability ID (Example: T001)]
set [ Enemy_IntentValue2 v] to [(How many should be added)]

Buff_Block:
set [ Enemy_IntentName v] to [Buff_Block]
set Enemy_IntentValue to random between [(minimum block power)] and [(maximum block power)]
set [ Enemy_IntentInfo v] to [(name of the status effect that the enemy applies)]
set [ Enemy_IntentValue2 v] to [(value of the status effect)]

Debuff:

Applying status effects:
set [ Enemy_IntentName v] to [Debuff]
set [ Enemy_IntentInfo v] to [(name of the status effect)]
set [ Enemy_IntentValue2 v] to [(value of the status effect)]

Adding Abilities to the player's Draw Pile:
set [ Enemy_IntentName v] to [Debuff]
set [ Enemy_IntentInfo v] to [AddCard]
set [ Enemy_IntentInfo2 v] to [Ability ID (Example: T001)]
set [ Enemy_IntentValue2 v] to [(How many should be added)]

Buff:
set [ Enemy_IntentName v] to [Buff]
set [ Enemy_IntentInfo v] to [(name of the status effect)]
set [ Enemy_IntentValue2 v] to [(value of the status effect)]

Nothing (stunned):
set [ Enemy_IntentName v] to [Stunned]

Other:

Summon enemies:
set [ Enemy_IntentName v] to [Summon]
set [ Enemy_IntentValue v] to [(How many enemies should be summoned)]
set [ Enemy_IntentInfo v] to [Enemy ID (Example: E_001)]

A few things to note:
- Currently, all status effects have to be hard-scripted inside the “initiate enemy intend” custom block, but I am planning to make this more “modular” as well by just using the Status Effect numbers
- While an enemy has their set intent pattern, what intend most enemies use is dependent on their turn number. So in the case of a Slime, Slime #1 will attack, while Slime #2 will block on turn 1. If you don't want this to happen, remove the “Enemy_TurnNumber”-variable from the following script:
<(((Enemy_PlayedTurns) + (Enemy_TurnNumber)) mod (0)) = []>
-In general, if you're looking for help with enemy intents, it's always good to look at existing enemy intent patterns




3. Adding Abilities

Adding Abilities to the game consists of these steps:
a. (Drawing and) adding the Ability costume to the “Cards”-Sprite
b. Defining the Ability's properties
c. Coding the effects for the Ability
d. Adding the Ability to the Loot table(s)

So let's start!

a) Drawing and adding your Ability costume to the “Cards”-Sprite:

First the fun part: Drawing! The inside of the card can look however you like, but there are a few design-rules Ability costumes follow, when it comes to the border of the Ability.

The gems in the top-left and bottom-right corner of each Ability indicate what type of Ability it is:



Attacks have red gems, Skills have green gems, Auras have blue gems and Statuses have dark grey gems.
As a general rule of thumb: If your Ability deals any form of direct attack damage, it should be considered an Attack.
If it does something else in the moment, it's a Skill.
If it has a lingering effect for the rest of this battle, it's an Aura.


Next, the border itself has a different color, to give some extra little info on what it belongs to:



Here you can see that neutral abilities have a light grey border, while abilities specific to Lunara have blue borders.
If an ability comes from a special item, like Cecil's KI-Saber, for example, they also have a different colored border to indicate that (in this case, green).
Since statuses come from enemies or your own abilities, they have a dark grey border to set them apart.

Now, you have hopefully drawn your Ability (in Scratch or other programs) and you're ready to add it!
To do so, add a new costume to the Sprite “Cards”.

The naming of your Ability costume is very important, as it is directly tied to the code of the game.
This is called the “Card ID”
Card IDs look like this: A001


The first letter indicates what type of Ability it is:
A for Attacks
S for Skills
P for Auras
T for Statuses

The three digits following this letter are the Card ID number.
At the moment of writing this guide, there are 35 Attack Abilities in the base game - The 35th being “A035” (Cecil's KI-Saber Attack “Vectored Blast”).
Therefore, if you were to add a new Attack to the game, you would have to call it “A036”.
Same goes for Skills (currently 30), Auras (currently 14) and Statuses (currently 5).

b) Defining the Abilities properties:

Next up, we have to open a bunch of lists and add some properties to our card, like how much it costs, what it's name is, what the effect text should say and so on.

These are the relevant lists for Attacks, for example:

(Script_Attacks_CardCosts :: list)
Defines the Cost of a card (usually 0-3)

(Script_Attacks_CardEffects :: list)
Defines what the effect text should say. If your effect has any text that changes based on the situation, that is a special case that you have to hardcode.
This includes attacks that deal damage or gain block, as the damage and block is affected by your Strength, Weakness (and Vulnerability).
To hardcode this, go into the Stage “Sprite” and scroll down a little, until you find a bunch of “replace item of list” blocks.
You'll notice quickly that these are all set up in a similar fashion, where the effect text is put together through “join”-blocks, and every attack damage value is being added to strength (item 5 of Player_StatusList) and then multiplied by Weakness (Player_WeaknessMultiplier) and Vulnerability (Script_TargetVulnerabilityMultiplier).
For the most part, you can copy one of these blocks and edit them as you please.

(Script_Attacks_CardNames :: list)
The Name of your Ability. Pretty simple stuff, there's little to do wrong here. Just pick a cool and fitting name :>

(Script_Attacks_CardTargets :: list)
Defines who this Ability targets. Currently, there are four different Target-Types:
T = Targets a single enemy (Example: Slash)
A = Targets all enemies (Example: Cold Wave)
R = Targets a random enemy (Example: Blizzard)
S = Targets yourself (Example: Block)
0 = Targets nobody - and is therefore unplayable (Example: Confused)


c) Coding the effects of the Ability:

Once you have set all the basic properties of your Ability, it's time to move on to the part that can be the most complex, depending on what your Ability should do: Coding the effect!
First of all, you have to figure this out: Who does this Ability affect?
If it is an Attack, it most likely will damage the enemy, which is why it will be mostly coded in the “Enemies”-Sprite.
Same thing if it applies a Status Effect like Poison to the Enemy.
If it has some form of Effect that affects the Player, like giving them Block or applying a Status Effect to them, then that will be coded in the “Player”-Sprite.
Both of these things can be the case, so some Abilities will have some code in the Player Sprite and some code in the Enemies Sprite.
(Note: Auras, as of yet, exclusively happen in the Player Sprite.)

Let's start with the Enemies:
Go into the Enemy Sprite and then look for a custom Block called:
define Activate Attack Card Effect ID: (CardID) Target: (TargetNumber)
(if you're coding an Attack)

or look for a custom Block called:
define Activate Skill Card Effect ID: (CardID) Target: (TargetNumber)
(if you're coding a Skill)

The contents of these custom Blocks should already give you a good idea of how this will work.
Add an if-Block checking for the CardID of your Ability and code away!

Here are some of the most common blocks to use:

Deal (round ((([(BaseDamage)] + (item (5 v) of [Player_StatusList v] :: list)) * (Player_WeaknessMultiplier)) * (Enemy_VulnerabilityMultiplier))) Damage to Enemy: [(TargetNumber)] [(DamageType)]
As this custom block implies, this deals damage to the chosen enemy (usually you just throw in the “TargetNumber” custom-block-variable in there to make it deal damage to the targeted enemy).
The DamageType at the end is usually just “Attack”, to make it trigger effects that do something when attack damage is taken.
“Effect” damage is something that is used less here.


replace item ( v) of [Enemy_StatusList v] with ((item ( v) of [Enemy_StatusList v] :: list) + ())
This Block is used to add a Status Effect to an enemy (or subtract it, if you want to), like Strength, Weakness, etc.
As mentioned previously in this guide, you can see a list of all Status Effects in the Stage Sprite, if you scroll to the right a little.
This block is usually accompanied by the code that makes the Text-Animation of the StatusEffect appear above the target's head.


add (join (Enemy_TurnNumber) [001]) to [Anim_Effects_Queue v]
This adds a cosmetic Ability Animation to the Effect. In this case, the local Variable “Enemy_TurnNumber” is being used to make the Animation appear on top of the targeted Enemy. If you want it to appear over the Player, use “1” here.
The three following digits are the ID of the Ability Animation. You can check inside the sprite “AbilityAnimations” to see which Animation has which number.
(The basic slashing Animation is 001, for example, while a poison cloud is 006).

change [Player_Block v] by (round (([Base Block value] + (item (5 v) of [Player_StatusList v] :: list)) * (Player_WeaknessMultiplier)))
This adds Block to the Player.

change [Script_DrawCardQueue v] by ()
This draws cards.
To add specific cards or draw cards with specific Properties, check Chapter “5. Other random info”, at the bottom of this guide.


Now, if you're coding something that affects the Player, go into the “Player”-Sprite and look for similar custom Blocks.
In general, if you want to learn more about how to code your Ability, it is always a good idea to check out how the already existing Abilities are coded.


d) Adding the Ability to the Loot table(s):

Now for the last step!
In the “Loop&Startup” Sprite, there's a custom block called “Reset Loot/Events/Deck”.
In there, you can probably already see that I ordered the cards being added to the loot tables and the player starting deck.
You can just copy one of the “add to list” blocks and change the name of the card being added to match the card ID of the card you made.
And that's it! It should appear in the starting Deck or in the “Learn a new Ability”-Menu, depending on where you added it to.


5. Other random info

Adding Abilities to your Hand/drawing Abilities:

If you want to draw an Ability (from your Draw Pile) or add a specific Ability to your Hand, you use the following two blocks:



As you can see, the “DrawCard_Properties” list items have two digits, the first one is for reducing cost of the drawn ability (can be set to 0-9).
The second digit can only be 0 or 1. If it is set to 1, then the card will always cost 0. (Items like Winged Boots use this)

It's absolutely essential that an item is added to both “DrawCard_Queue” and “DrawCard_Properties”, as the game will only draw/add an ability if both those lists contain the same amount of items.



Last edited by Apfellord (Sept. 16, 2023 11:54:54)

Black_robot_satin
Scratcher
11 posts

Official Monster World modding thread

Nice to see some helpful info for modders. Way better than spending a month on seeping though the sprites to understand how things work.
(still worth it tho! )
Apfellord
Scratcher
100+ posts

Official Monster World modding thread

Black_robot_satin wrote:

Nice to see some helpful info for modders. Way better than spending a month on seeping though the sprites to understand how things work.
(still worth it tho! )
¯\_(ツ)_/¯
(I'm so sorry friend)
XxPhantomDavexX
Scratcher
100+ posts

Official Monster World modding thread

Black_robot_satin wrote:

Nice to see some helpful info for modders. Way better than spending a month on seeping though the sprites to understand how things work.
(still worth it tho! )
Lol fr

I bet you 13946324587 dollars
you didn't read that number. You
just skipped right over it.
You didn't even realize I put a letter in it.
No, I didn't but you went back
and looked, I want a love !
-XxPhantomDavexX
Black_robot_satin
Scratcher
11 posts

Official Monster World modding thread

So, you want to make a mod for MW and add a new enemy / boss?

Fortunately MW is very modular and enemies can be added without
scripting every single action the enemy sprite has to do!
p.s. since i did not make this game, some information here could be misleading, faulty or just wrong! If something isn't right, please correct me!

Preparation:
We will be staying in the enemy sprite for this entire tutorial.
To define your enemies stats add an element to each of these lists:

Script_EnemyEXPValues
Script_EnemyHPBarSizes
Script_EnemyHPBarValues
Script_EnemyHeights
Script_EnemyNames

add your enemy pictures to the costumes of the enemy sprite and give them the names E_031_Idle1 / E_031_Idle2 / etc.

in this example, 031 is the index of the enemy. Make sure you don't use the same index for two enemies.

Spawn enemies:
Enemies get instantiated (created) in the “SpawnEnemies” Block.

If you want your enemy to spawn in a custom location, add a new if-statement with the parameter
“Map_CurrentAction = B_YourCustomLocationName” and add these blocks into the if-statement.
if <(Map_CurrentAction) = [(B_YourCustomLocationName)]> then
add [E_(your enemy index number)] to [Battle_Turns]
set [ Script_NumberKeeper] to (length of [ Battle_Turns] :: list)
switch costume to [ StartingCostume_Enemy]
create clone of [ myself]
end

Side information:
B_ stands for a Boss enemy.
E_ stands for an elite fight.
F_ stands for the default fight.
Q_ stands for an unknown action.
S_ stands for the shop.
I_ stands for the Inn.


If you want your enemy to spawn in an existing location (e.g. F_Grassland)
go to the if statement corresponding to that location. We will have to change the
first block.

If the location had five possible enemy setups previously,
set [Script_NK3] to ((((item ( 1) of [RNG_Moduli] :: list) mod (101)) mod (5)) + (1))
the block should look like this now, so you can add your own enemy setup.
set [Script_NK3] to ((((item ( 1) of [RNG_Moduli] :: list) mod (101)) mod (6)) + (1))

This block gives Script_NK3 a random value between one and the number we just changed
(including one and the number we just changed).

Now add another if-else-statement to the tree of if-else-statements with the
parameter “Script_NK3 = (the number we just changed)” and add these blocks
into the if-else-statement.
previous plocks...
if <(Script_NK3) = [5]> then
here are the blocks for summoning a slime and a neitro
else
if <(Script_NK3) = [6]> then
wait (0.1) secs
add [E_(the index of your enemy)] to [Battle_Turns]
set [ Script_NumberKeeper] to (length of [ Battle_Turns] :: list)
switch costume to [ StartingCostume_Enemy]
create clone of [ myself]
end
end

Status effect on spawn:
If you want your new enemy to have a Status effect on it at the start of the battle,
go to the “DefineEnimyStats” block and add an if-statement with the parameter
“Enemy_ID” = (Index of your new enemy)". In the if-statement, put in these blocks
if <(Enemy_ID) = [E_(index of your enemy)]> then
replace item [(index of the status effect)] of [Enemy_StatusList] with [(strength of the status effect)]
end
The first number represents the Status effect. There is a list of all status effect names and their index
numbers in the Stage sprite.

Attack pattern:
Now we need to define the attack pattern of our enemy. Go to the “DefineEnemyIntent” Block and add
a new if-statement with the parameter “Enemy_IDShortened = (Index of your new enemy without any zeros that don't have
a number higher than a zero to their left(that means 031 => 31 and 020 => 20))”.

An enemy always attacks in a certain pattern. Different enemies have different
pattern lengths. Let's look at an attack pattern of an existing enemy: the slime.
if <(Enemy_IDShortened) = [1]> then 
set [ Enemy_IntentEffectAnim] to [003]
if <(((Enemy_PlayedTurns) + (Enemy_TurnNumber)) mod (3)) = [0]> then
set [ Enemy_IntentName] to [Attack]
set Enemy_IntentValue to random between [4] and [6]
else
if <(((Enemy_PlayedTurns) + (Enemy_TurnNumber)) mod (3)) = [1]> then
set [ Enemy_IntentName] to [Block]
set Enemy_IntentValue to random between [4] and [6]
else
if <(((Enemy_PlayedTurns) + (Enemy_TurnNumber)) mod (3)) = [2]> then
set [ Enemy_IntentName] to [Attack]
set Enemy_IntentValue to random between [4] and [6]
end
end
end
end
the if-else-tree shows all the different actions this enemy will take.

  • The slime will first attack with a power of 4 to 6,
  • then it will block with a power of 4 to 6
  • and finally it will attack again with a power of 4 to 6.
after that, it will start this loop again.


Here are some block snippets to use for your own enemy:

Attack:
if <(((Enemy_PlayedTurns) + [(Enemy_TurnNumber)]) mod [(length of your attack pattern)]) = [(Turn number this action is performed)]> then 
set [ Enemy_IntentName] to [Attack]
set Enemy_IntentValue to random between [(minimum attack power)] and [(maximum attack power)]
end
Block:
if <(((Enemy_PlayedTurns) + [(Enemy_TurnNumber)]) mod [(length of your attack pattern)]) = [(Turn number this action is performed)]> then 
set [ Enemy_IntentName] to [Block]
set Enemy_IntentValue to random between [(minimum block power)] and [(maximum block power)]
end
Debuff_attack:
if <(((Enemy_PlayedTurns) + [(Enemy_TurnNumber)]) mod [(length of your attack pattern)]) = [(Turn number this action is performed)]> then 
set [ Enemy_IntentName] to [Debuff_Attack]
set Enemy_IntentValue to random between [(minimum attack power)] and [(maximum attack power)]
set [ Enemy_IntentInfo] to [(name of the status effect that is given to the player)]
set [ Enemy_IntentValue2] to [(strength of the status effect)]
end
Buff_Block:
if <(((Enemy_PlayedTurns) +  [(Enemy_TurnNumber)]) mod [(length of your attack pattern)]) = [(Turn number this action is performed)]> then 
set [ Enemy_IntentName] to [Buff_Block]
set Enemy_IntentValue to random between [(minimum block power)] and [(maximum block power)]
set [ Enemy_IntentInfo] to [(name of the status effect that is given to your enemy)]
set [ Enemy_IntentValue2] to [(strength of the status effect)]
end
Debuff:
if <(((Enemy_PlayedTurns) +  [(Enemy_TurnNumber)]) mod [(length of your attack pattern)]) = [(Turn number this action is performed)]> then 
set [ Enemy_IntentName] to [Debuff]
set [ Enemy_IntentInfo] to [(name of the status effect that is given to your enemy)]
set [ Enemy_IntentValue2] to [(strength of the status effect)]
end
Enemies can also summon other enemies, be stunned or just Buff themselves. It is always a good idea to look at existing
attack patterns as reference.

If you have any further questions, i an willing to help!
(or, you know, you could ask the person that actually made the game and knows literally everything about it…)

Last edited by Black_robot_satin (April 21, 2019 09:47:14)

Apfellord
Scratcher
100+ posts

Official Monster World modding thread

Black_robot_satin wrote:

So, you want to make a mod for MW and add a new enemy / boss?
(…)

Oh my word, Satin, this is amazing! Thank you so much for helping! :O
I'll be adding this to the main post if you don't mind - maybe expand on a few things here and there but you already did an incredible job at explaining how to create enemies!
XxPhantomDavexX
Scratcher
100+ posts

Official Monster World modding thread

Apfellord wrote:

Black_robot_satin wrote:


Ty for this

Last edited by XxPhantomDavexX (March 27, 2019 19:43:32)


I bet you 13946324587 dollars
you didn't read that number. You
just skipped right over it.
You didn't even realize I put a letter in it.
No, I didn't but you went back
and looked, I want a love !
-XxPhantomDavexX
basilisk2004
Scratcher
80 posts

Official Monster World modding thread

I have made a mod adding a new elite enemy.
link here
It is very powerful and probably unbalanced.
The mod is called ‘Monster Pack Mod’, because more monsters are planned, even though only 1 is currently in the mod.
Black_robot_satin
Scratcher
11 posts

Official Monster World modding thread

basilisk2004 wrote:

I have made a mod adding a new elite enemy.
link here
It is very powerful and probably unbalanced.
The mod is called ‘Monster Pack Mod’, because more monsters are planned, even though only 1 is currently in the mod.
Wow, good job so far! I like the usage of the spiky buff. (Also, if you only target the ebony watcher it's not so hard. )
FireHorse27
Scratcher
100+ posts

Official Monster World modding thread

basilisk2004 wrote:

I have made a mod adding a new elite enemy.
link here
It is very powerful and probably unbalanced.
The mod is called ‘Monster Pack Mod’, because more monsters are planned, even though only 1 is currently in the mod.
If you just attack the ebony watcher, you can kill it pretty quickly. I like that the spiky buff slowly increases so that you can't easily farm the neitros.
basilisk2004
Scratcher
80 posts

Official Monster World modding thread

FireHorse27 wrote:

basilisk2004 wrote:

I have made a mod adding a new elite enemy.
link here
It is very powerful and probably unbalanced.
The mod is called ‘Monster Pack Mod’, because more monsters are planned, even though only 1 is currently in the mod.
If you just attack the ebony watcher, you can kill it pretty quickly. I like that the spiky buff slowly increases so that you can't easily farm the neitros.
Thanks!
basilisk2004
Scratcher
80 posts

Official Monster World modding thread

Black_robot_satin wrote:

basilisk2004 wrote:

I have made a mod adding a new elite enemy.
link here
It is very powerful and probably unbalanced.
The mod is called ‘Monster Pack Mod’, because more monsters are planned, even though only 1 is currently in the mod.
Wow, good job so far! I like the usage of the spiky buff. (Also, if you only target the ebony watcher it's not so hard. )
Thanks! The tip was helpful, I was having serious issues trying to beat it
I have added another monster as well now.
basilisk2004
Scratcher
80 posts

Official Monster World modding thread

Hey, Apfellord, you got the HP bar sizes the wrong way round. 2 is medium, 1 is large, but I haven't checked 0 yet.
FireHorse27
Scratcher
100+ posts

Official Monster World modding thread

Could you make a lost of Status effects and their IDs and Enemies and their index number please?

Last edited by FireHorse27 (April 20, 2019 17:19:21)

basilisk2004
Scratcher
80 posts

Official Monster World modding thread

FireHorse27 wrote:

Could you make a lost of Status effects and their IDs and Enemies and their index number please?
In the stage sprite there is a list of status effects and IDs. For Enemy index numbers, just go into the costumes on the enemy sprite, and the index number is contained within the costume name for each enemy.
FireHorse27
Scratcher
100+ posts

Official Monster World modding thread

basilisk2004 wrote:

FireHorse27 wrote:

Could you make a lost of Status effects and their IDs and Enemies and their index number please?
In the stage sprite there is a list of status effects and IDs. For Enemy index numbers, just go into the costumes on the enemy sprite, and the index number is contained within the costume name for each enemy.
Okay, thanks! I did not notice the list of status effect IDs.
FireHorse27
Scratcher
100+ posts

Official Monster World modding thread

d) Defining enemy intents:

Now we need to define the intent pattern of our enemy.
Go to the “DefineEnemyIntent” custom block and add a new if-statement with the parameter “Enemy_IDShortened = (Index of your new enemy without any extra zeros (so 031 => 31 and 002 => 20)”.
Just a few quick corections, “so 031 => 31 and 002 => 20” should be “so 031 => 31 and 002 => 2” with the 20 becoming a 2, also
An enemy always acts in a certain pattern. Different enemies have different pattern lengths.
Lets look at an attack pattern of an existing enemy: the slime.
Lets should be written Let's with an apostrophe.

Last edited by FireHorse27 (April 20, 2019 20:27:22)

Apfellord
Scratcher
100+ posts

Official Monster World modding thread

FireHorse27 wrote:

d) Defining enemy intents:

Now we need to define the intent pattern of our enemy.
Go to the “DefineEnemyIntent” custom block and add a new if-statement with the parameter “Enemy_IDShortened = (Index of your new enemy without any extra zeros (so 031 => 31 and 002 => 20)”.
Just a few quick corections, “so 031 => 31 and 002 => 20” should be “so 031 => 31 and 002 => 2” with the 20 becoming a 2, also
An enemy always acts in a certain pattern. Different enemies have different pattern lengths.
Lets look at an attack pattern of an existing enemy: the slime.
Lets should be written Let's with an apostrophe.

Thanks, fixed that now!
FireHorse27
Scratcher
100+ posts

Official Monster World modding thread

Which status effects affect enemies? I know that liquidationForm and Regeneration don't but it would be helpful if they did.
basilisk2004
Scratcher
80 posts

Official Monster World modding thread

FireHorse27 wrote:

Which status effects affect enemies? I know that liquidationForm and Regeneration don't but it would be helpful if they did.
Yeah, this would be handy to know. I tried giving one Regeneration and it didn't work. Also, some status effects don't seem to be possible for the enemy to inflict on the player; I tried making an enemy that gave CostIncrease, but it didn't work.

Powered by DjangoBB