Skip to content

Commit

Permalink
Add edentity blocks & createblock()
Browse files Browse the repository at this point in the history
This adds editor entity blocks (boxes which do different things on
collision) like activity zones, hurt boxes, etc.

This also adds a command to go along with it, to both match
`createentity` and so block spawning can be behind conditions.
  • Loading branch information
AllyTally authored and NyakoFox committed Jun 4, 2024
1 parent 16d75d2 commit bb0bd53
Show file tree
Hide file tree
Showing 6 changed files with 138 additions and 1 deletion.
20 changes: 19 additions & 1 deletion desktop_version/src/CustomLevels.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1214,6 +1214,15 @@ bool customlevelclass::load(std::string _path)
edEntityEl->QueryIntAttribute("p5", &entity.p5);
edEntityEl->QueryIntAttribute("p6", &entity.p6);

const char* activitytext = "";
const char* activitycolour = "";

edEntityEl->QueryStringAttribute("activitytext", &activitytext);
edEntityEl->QueryStringAttribute("activitycolour", &activitycolour);

entity.activitytext = activitytext;
entity.activitycolour = activitycolour;

customentities.push_back(entity);
}
}
Expand Down Expand Up @@ -1568,7 +1577,16 @@ bool customlevelclass::save(const std::string& _path)
edentityElement->SetAttribute( "p3", customentities[i].p3);
edentityElement->SetAttribute( "p4", customentities[i].p4);
edentityElement->SetAttribute( "p5", customentities[i].p5);
edentityElement->SetAttribute( "p6", customentities[i].p6);
edentityElement->SetAttribute( "p6", customentities[i].p6);
if (!customentities[i].activitytext.empty())
{
edentityElement->SetAttribute("activitytext", customentities[i].activitytext.c_str());
}
if (!customentities[i].activitycolour.empty())
{
edentityElement->SetAttribute("activitycolour", customentities[i].activitycolour.c_str());
}

edentityElement->LinkEndChild( doc.NewText( customentities[i].scriptname.c_str() )) ;
msg->LinkEndChild( edentityElement );
}
Expand Down
2 changes: 2 additions & 0 deletions desktop_version/src/CustomLevels.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ class CustomEntity
//parameters
int p1, p2, p3, p4, p5, p6;
std::string scriptname;
std::string activitycolour;
std::string activitytext;
};


Expand Down
61 changes: 61 additions & 0 deletions desktop_version/src/Editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1112,6 +1112,67 @@ static void draw_entities(void)
font::print(PR_FONT_LEVEL | PR_BOR | PR_CJK_HIGH, x, y - 8, entity->scriptname, 210, 210, 255);
}
break;
case 20: // Activity Zones
graphics.draw_rect(x, y, entity->p1 * 8, entity->p2 * 8, graphics.getRGB(164, 255, 255));
graphics.draw_rect(x, y, 8, 8, graphics.getRGB(255, 255, 255));
if (i == edent_under_cursor)
{
font::print(PR_FONT_LEVEL | PR_BOR | PR_CJK_HIGH, x, y - 8, entity->scriptname, 210, 210, 255);
}
break;
case 21: // Collision Boxes
graphics.draw_rect(x, y, entity->p1 * 8, entity->p2 * 8, graphics.getRGB(164, 255, 164));
graphics.draw_rect(x, y, 8, 8, graphics.getRGB(255, 255, 255));
break;
case 22: // Damage Boxes
graphics.draw_rect(x, y, entity->p1 * 8, entity->p2 * 8, graphics.getRGB(255, 164, 164));
graphics.draw_rect(x, y, 8, 8, graphics.getRGB(255, 255, 255));
break;
case 23: // Directional Boxes
{
// Move x and y to the center of the box
int arrow_x = x + (entity->p1 - 1) * 4;
int arrow_y = y + (entity->p2 - 1) * 4;

if (customentities[i].p3 == 0)
{
// UP ARROW
font::print(PR_FONT_LEVEL | PR_BOR | PR_CJK_HIGH, arrow_x, arrow_y, "\xE2\x86\x91", 255, 255, 255);
}
else if (customentities[i].p3 == 1)
{
// DOWN ARROW
font::print(PR_FONT_LEVEL | PR_BOR | PR_CJK_HIGH, arrow_x, arrow_y, "\xE2\x86\x93", 255, 255, 255);
}
else if (customentities[i].p3 == 2)
{
// LEFT ARROW
font::print(PR_FONT_LEVEL | PR_BOR | PR_CJK_HIGH, arrow_x, arrow_y, "\xE2\x86\x90", 255, 255, 255);
}
else if (customentities[i].p3 == 3)
{
// RIGHT ARROW
font::print(PR_FONT_LEVEL | PR_BOR | PR_CJK_HIGH, arrow_x, arrow_y, "\xE2\x86\x92", 255, 255, 255);
}
graphics.draw_rect(x, y, entity->p1 * 8, entity->p2 * 8, graphics.getRGB(255, 255, 164));
break;
}
case 24: // Safe Boxes
graphics.draw_rect(x, y, entity->p1 * 8, entity->p2 * 8, graphics.getRGB(164, 164, 255));
graphics.draw_rect(x, y, 8, 8, graphics.getRGB(255, 255, 255));
break;
case 25: // Gamestate Triggers
{
graphics.draw_rect(x, y, entity->p1 * 8, entity->p2 * 8, graphics.getRGB(255, 164, 255));
graphics.draw_rect(x, y, 8, 8, graphics.getRGB(255, 255, 255));

int arrow_x = x + (entity->p1 - 1) * 4;
int arrow_y = y + (entity->p2 - 1) * 4;

font::print(PR_FONT_LEVEL | PR_BOR | PR_CJK_HIGH, arrow_x, arrow_y, help.String(entity->p3), 255, 255, 255);

break;
}
case 50: // Warp Lines
if (entity->p1 >= 2) // Horizontal
{
Expand Down
1 change: 1 addition & 0 deletions desktop_version/src/Entity.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -851,6 +851,7 @@ void entityclass::createblock( int t, int xp, int yp, int w, int h, int trig /*=
block.type = ACTIVITY;
block.wp = w;
block.hp = h;
block.script = script;
block.rectset(xp, yp, w, h);

//Ok, each and every activity zone in the game is initilised here. "Trig" in this case is a variable that
Expand Down
21 changes: 21 additions & 0 deletions desktop_version/src/Map.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1937,6 +1937,27 @@ void mapclass::loadlevel(int rx, int ry)
obj.createblock(TRIGGER, ex, ey, ent.p1 * 8, ent.p2 * 8, 300 + tempscriptbox, "custom_" + ent.scriptname);
tempscriptbox++;
break;
case 20: // Activity Zone
obj.customactivitytext = ent.activitytext;
obj.customactivitycolour = ent.activitycolour;
obj.customscript = ent.scriptname;
obj.createblock(ACTIVITY, ex, ey, ent.p1 * 8, ent.p2 * 8, 35, "custom_" + ent.scriptname, true);
break;
case 21: // Collision Box
obj.createblock(BLOCK, ex, ey, ent.p1 * 8, ent.p2 * 8);
break;
case 22: // Damage Box
obj.createblock(DAMAGE, ex, ey, ent.p1 * 8, ent.p2 * 8);
break;
case 23: // Directional Box
obj.createblock(DIRECTIONAL, ex, ey, ent.p1 * 8, ent.p2 * 8, ent.p3);
break;
case 24: // Safe Box
obj.createblock(SAFE, ex, ey, ent.p1 * 8, ent.p2 * 8);
break;
case 25: // Trigger
obj.createblock(TRIGGER, ex, ey, ent.p1 * 8, ent.p2 * 8, ent.p3);
break;
case 50: // Warp Lines
obj.customwarpmode=true;
switch (ent.p1)
Expand Down
34 changes: 34 additions & 0 deletions desktop_version/src/Script.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -899,6 +899,40 @@ void scriptclass::run(void)
words[8] = word8;
words[9] = word9;
}
else if (words[0] == "createblock")
{
int i = BLOCK;
if (words[1] == "block")
{
i = BLOCK;
}
else if (words[1] == "trigger" || words[1] == "script")
{
i = TRIGGER;
}
else if (words[1] == "damage")
{
i = DAMAGE;
}
else if (words[1] == "directional")
{
i = DIRECTIONAL;
}
else if (words[1] == "safe")
{
i = SAFE;
}
else if (words[1] == "activity")
{
i = ACTIVITY;
}
else
{
i = ss_toi(words[1]);
}

obj.createblock(i, ss_toi(words[2]), ss_toi(words[3]), ss_toi(words[4]), ss_toi(words[5]), ss_toi(words[6]), words[7], true);
}
else if (words[0] == "createcrewman")
{
// Note: Do not change the "r" variable, it's used in custom levels
Expand Down

0 comments on commit bb0bd53

Please sign in to comment.