Map Database  •  FAQ  •  RSS  •  Login

Choose Wisely - map idea

<<

Nightry

Serf

Posts: 7

Joined: 24 Feb 2015, 09:13

KaM Skill Level: Skilled

Post 11 Nov 2015, 16:38

Choose Wisely - map idea

Hi all :D
I have a map idea but need help with dynamic scripting :/
I think about a map in which the players choose units by moving the barbarian(or another unit,idk yet) to them and they spawn near the players barracks.It could be for 4 or 8 players.
Jednostki.png
Jadnostki 2.png
Next lvl units would unlock after reaching:
Lvl 1: 0-100 kills
Lvl 2: 101-200
Lvl 3: 201-300
The goal is to destroy the enemy barracks.


What do you think ?
Can someone do such a script or will it be too difficult :/ ?
You do not have the required permissions to view the files attached to this post.
<<

Ben

User avatar

Former Site Admin

Posts: 3814

Joined: 08 Jan 2009, 23:00

Location: California - Pacific Time (UTC -8/-7 Summer Time)

Post 11 Nov 2015, 18:34

Re: Choose Wisely - map idea

It wouldn't be hard to script at all. This reminds me of a the "blood" maps in AoE. The game mode can be made more interesting by making a center bonus/king of the hill bonus or something similar.
I used to spam this forum so much...
<<

Esthlos

User avatar

Knight

Posts: 676

Joined: 23 Jun 2013, 16:02

KaM Skill Level: Beginner

Post 11 Nov 2015, 22:30

Re: Choose Wisely - map idea

Maybe it would be even easier and neater using a road plan instead of a barbarian?

Something like
(The 8 values under "const" have to be set as needed)
(Edit the code under "function aGetUnitLevel" if you want to add or change the levels)
  Code:
const cNeutralPlayer = 0; //The id of the player whose units act as a placeholder in the selection area; player 1's id is 0, player 2's is 1, etc cSpawnDelay = 0; //Ticks to skip between spawns; 1 tick equals 0,1 seconds cKillsPerLevel = 100; //After how many kills your level increases cMaxLevel = 3; //Highest level achievable //Limits of the selection area: cAreaXMin = 0; //The X coordinate of the leftmost edge cAreaXMax = 300; //The X coordinate of the rightmost edge cAreaYMin = 0; //The Y coordinate of the top edge cAreaYMax = 300; //The Y coordinate of the bottom edge ////////////////////////////////////////////////////////// var aChoiceLoc: array of Record aX, aY, aUnit, aLevel, aBX, aBY: Integer; end; aDelay: Integer; function aGetUnitLevel(aType: Integer): Integer; begin result := cMaxLevel+1; // Skip unforeseen units case aType of 24, 25, 27: result := 1; 14, 15, 17, 19, 21: result := 2; 16, 18, 20, 22, 26: result := 3; end; end; procedure OnMissionStart; var i, i2, iHouses: Integer; begin SetLength(aChoiceLoc, States.LocationCount); for i := 0 to States.LocationCount-1 do begin aChoiceLoc[i].aUnit := -1; aChoiceLoc[i].aLevel := 1; iHouses := States.PlayerGetAllHouses(i); for i2 := 0 to Length(iHouses)-1 do if States.HouseType(iHouses[i2]) = 21 then begin aChoiceLoc[i].aBX := States.HousePositionX(iHouses[i2]); aChoiceLoc[i].aBY := States.HousePositionY(iHouses[i2])+1; end; end; Actions.ShowMsg(-1, 'Place a Road plan near the unit you want to spawn; as you level up, you'll gain access to more powerful spawns.'); end; procedure OnPlanRoadPlaced(aIndex, X, Y: Integer); var iUnits: array of Integer; i, iDist, iDistBest: Integer; begin if (X < cAreaXMin) OR (X > cAreaXMax) then Exit; if (Y < cAreaYMin) OR (Y > cAreaYMax) then Exit; if aChoiceLoc[aIndex].aUnit > -1 then Actions.PlanRemove(aIndex, aChoiceLoc[aIndex].aX, aChoiceLoc[aIndex].aY); aChoiceLoc[aIndex].aX := X; aChoiceLoc[aIndex].aX := Y; iUnits := States.PlayerGetAllUnits(cNeutralPlayer); iDistBest := -1; for i := 0 to Length(iUnits)-1 do if (aGetUnitLevel(States.UnitType(iUnits[i])) <= aChoiceLoc[aIndex].aLevel) then begin iDist := (X-States.UnitPositionX(iUnits[i]))*(X-States.UnitPositionX(iUnits[i]))+(Y-States.UnitPositionY(iUnits[i]))*(Y-States.UnitPositionY(iUnits[i])); if (iDist < iDistBest) OR (iDistBest = -1) then begin iDistBest := iDist; aChoiceLoc[aIndex].aUnit := States.UnitType(iUnits[i]); end; end; end; procedure OnTick; var iUnits: array of Integer; i, iLevel: Integer; begin Inc(aDelay); if aDelay >= cSpawnDelay then begin aDelay := -1; for i := 0 to States.LocationCount-1 do if (aChoiceLoc[i].aUnit > -1) AND (aChoiceLoc[i].aLevel > 0) then begin if aChoiceLoc[i].aLevel < cMaxLevel then begin iLevel := (States.StatUnitKilledMultipleTypesCount(i, [14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]) div (cKillsPerLevel+1)); if iLevel <> aChoiceLoc[i].aLevel then Actions.ShowMsg(i, 'Level up!||You can now choose a more powerful unit'); aChoiceLoc[i].aLevel := iLevel; end; Actions.GiveGroup(i, aChoiceLoc[i].aUnit, aChoiceLoc[i].aBX, aChoiceLoc[i].aBY, 4, 1, 1); end; //Making sure the placeholders don't starve iUnits := States.PlayerGetAllUnits(cNeutralPlayer); for i := 0 to Length(iUnits)-1 do UnitHungerSet(iUnits[i], States.UnitMaxHunger); end; end; procedure OnHouseDestroyed(aHouseID, aDestroyerIndex: Integer); var iP: Integer; begin if States.HouseType(aHouseID) = 21 then begin iP := States.HouseOwner(aHouseID); aChoiceLoc[iP].aLevel := -1; aChoiceLoc[iP].aUnit := -1; Actions.ShowMsg(iP, 'You have been defeated'); end; end;
Last edited by Esthlos on 13 Nov 2015, 11:01, edited 4 times in total.
Just when you think you know something, you have to look at it in another way, even though it may seem silly or wrong. You must try! - John Keating, "Dead Poets Society"
<<

Nightry

Serf

Posts: 7

Joined: 24 Feb 2015, 09:13

KaM Skill Level: Skilled

Post 13 Nov 2015, 05:38

Re: Choose Wisely - map idea

Thanks ;)
You are right. I have played somethink like this in aom and aoe.
I will work on the map tomorrow.
Is the script for the road or barbarian choose method ??
Im really a noob in delphy but i will try xd
<<

Esthlos

User avatar

Knight

Posts: 676

Joined: 23 Jun 2013, 16:02

KaM Skill Level: Beginner

Post 13 Nov 2015, 10:54

Re: Choose Wisely - map idea

Is the script for the road or barbarian choose method ??
Road.
It can be changed to Barbarian if you really want to, but I think it is neater and more efficient this way instead.
Just when you think you know something, you have to look at it in another way, even though it may seem silly or wrong. You must try! - John Keating, "Dead Poets Society"
<<

Nightry

Serf

Posts: 7

Joined: 24 Feb 2015, 09:13

KaM Skill Level: Skilled

Post 13 Nov 2015, 11:37

Re: Choose Wisely - map idea

So I need to place the road near the unit i want spawn yep ?
<<

Esthlos

User avatar

Knight

Posts: 676

Joined: 23 Jun 2013, 16:02

KaM Skill Level: Beginner

Post 13 Nov 2015, 12:58

Re: Choose Wisely - map idea

So I need to place the road near the unit i want spawn yep ?
Yup, the script looks for the closest placeholder unit when you place a road plan.

Please note that I didn't test the script, so there may be typos or other bugs.
Just when you think you know something, you have to look at it in another way, even though it may seem silly or wrong. You must try! - John Keating, "Dead Poets Society"
<<

Nightry

Serf

Posts: 7

Joined: 24 Feb 2015, 09:13

KaM Skill Level: Skilled

Post 13 Nov 2015, 15:14

Re: Choose Wisely - map idea

Soo i want the selection area to be x=30 and y=20 from the left top corner in the editor.
  Code:
//Limits of the selection area: cAreaXMin = 30; //The X coordinate of the leftmost edge cAreaXMax = 0; //The X coordinate of the rightmost edge cAreaYMin = 20; //The Y coordinate of the top edge cAreaYMax = 0; //The Y coordinate of the bottom edge
Right ?

I also get this mistake :/
  Code:
2015-11-13 16:13:05.937 Script compile errors: [Error] (38:44): Type mismatch
<<

Esthlos

User avatar

Knight

Posts: 676

Joined: 23 Jun 2013, 16:02

KaM Skill Level: Beginner

Post 13 Nov 2015, 21:24

Re: Choose Wisely - map idea

Right ?
Nope :P

The point [0;0] is at the top-left corner... in the editor you can see the coordinates of the tile your cursor is on :wink:
I also get this mistake :/
  Code:
2015-11-13 16:13:05.937 Script compile errors: [Error] (38:44): Type mismatch
As predicted, there were typos :$

Here the fixed code:
  Code:
const cNeutralPlayer = 0; //The id of the player whose units act as a placeholder in the selection area; player 1's id is 0, player 2's is 1, etc cSpawnDelay = 50; //Ticks to skip between spawns; 1 tick equals 0,1 seconds cKillsPerLevel = 100; //After how many kills your level increases cMaxLevel = 3; //Highest level achievable //Limits of the selection area: cAreaXMin = 0; //The X coordinate of the leftmost edge cAreaXMax = 30; //The X coordinate of the rightmost edge cAreaYMin = 0; //The Y coordinate of the top edge cAreaYMax = 20; //The Y coordinate of the bottom edge ////////////////////////////////////////////////////////// var aChoiceLoc: array of Record aX, aY, aUnit, aLevel, aEndLevel, aBX, aBY: Integer; end; aDelay: Integer; function aGetUnitLevel(aType: Integer): Integer; begin result := cMaxLevel+1; // Skip unforeseen units case aType of 24, 25, 27: result := 1; 14, 15, 17, 19, 21: result := 2; 16, 18, 20, 22, 26: result := 3; end; end; procedure aUpdateAvailable(aPlayer: Integer); var iUnits: array of Integer; i: Integer; begin iUnits := States.PlayerGetAllUnits(cNeutralPlayer); for i := 0 to Length(iUnits)-1 do if aGetUnitLevel(States.UnitType(iUnits[i])) <= aChoiceLoc[aPlayer].aLevel then Actions.PlanRemove(aPlayer, States.UnitPositionX(iUnits[i]), States.UnitPositionY(iUnits[i])) else Actions.PlanAddWinefield(aPlayer, States.UnitPositionX(iUnits[i]), States.UnitPositionY(iUnits[i])); end; procedure OnMissionStart; var i, i2: Integer; iHouses: array of Integer; begin SetLength(aChoiceLoc, States.LocationCount); for i := 0 to States.LocationCount-1 do if i <> cNeutralPlayer then begin aChoiceLoc[i].aUnit := -1; aChoiceLoc[i].aLevel := 1; aChoiceLoc[i].aEndLevel := 1; iHouses := States.PlayerGetAllHouses(i); for i2 := 0 to Length(iHouses)-1 do if States.HouseType(iHouses[i2]) = 21 then begin aChoiceLoc[i].aBX := States.HousePositionX(iHouses[i2]); aChoiceLoc[i].aBY := States.HousePositionY(iHouses[i2])+1; end; aUpdateAvailable(i); end; Actions.ShowMsg(-1, 'Place a Road plan near the unit you want to spawn; as you level up, you''ll gain access to more powerful spawns.'); aDelay := cSpawnDelay; end; procedure OnPlanRoadPlaced(aIndex, X, Y: Integer); var iUnits: array of Integer; i, iDist, iDistBest: Integer; begin if (X < cAreaXMin) OR (X > cAreaXMax) then Exit; if (Y < cAreaYMin) OR (Y > cAreaYMax) then Exit; if aChoiceLoc[aIndex].aUnit > -1 then Actions.PlanRemove(aIndex, aChoiceLoc[aIndex].aX, aChoiceLoc[aIndex].aY); aChoiceLoc[aIndex].aX := X; aChoiceLoc[aIndex].aY := Y; if aChoiceLoc[aIndex].aLevel = -1 then Exit; iUnits := States.PlayerGetAllUnits(cNeutralPlayer); iDistBest := -1; for i := 0 to Length(iUnits)-1 do if (aGetUnitLevel(States.UnitType(iUnits[i])) <= aChoiceLoc[aIndex].aLevel) then begin iDist := (X-States.UnitPositionX(iUnits[i]))*(X-States.UnitPositionX(iUnits[i]))+(Y-States.UnitPositionY(iUnits[i]))*(Y-States.UnitPositionY(iUnits[i])); if (iDist < iDistBest) OR (iDistBest = -1) then begin iDistBest := iDist; aChoiceLoc[aIndex].aUnit := States.UnitType(iUnits[i]); end; end; end; procedure OnPlanRoadRemoved(aIndex, X, Y: Integer); begin if (X = aChoiceLoc[aIndex].aX) AND (Y = aChoiceLoc[aIndex].aY) then aChoiceLoc[aIndex].aUnit := -1; end; procedure OnPlanWinefieldRemoved(aIndex, X, Y: Integer); begin if (X < cAreaXMin) OR (X > cAreaXMax) then Exit; if (Y < cAreaYMin) OR (Y > cAreaYMax) then Exit; Actions.PlanAddWinefield(aIndex, X, Y); end; procedure OnPlanWinefieldPlaced(aIndex, X, Y: Integer); begin if (X < cAreaXMin) OR (X > cAreaXMax) then Exit; if (Y < cAreaYMin) OR (Y > cAreaYMax) then Exit; Actions.PlanRemove(aIndex, X, Y); end; procedure OnPlanFieldRemoved(aIndex, X, Y: Integer); begin if (X < cAreaXMin) OR (X > cAreaXMax) then Exit; if (Y < cAreaYMin) OR (Y > cAreaYMax) then Exit; Actions.PlanAddField(aIndex, X, Y); end; procedure OnPlanFieldPlaced(aIndex, X, Y: Integer); begin if (X < cAreaXMin) OR (X > cAreaXMax) then Exit; if (Y < cAreaYMin) OR (Y > cAreaYMax) then Exit; Actions.PlanRemove(aIndex, X, Y); end; procedure OnTick; var iUnits: array of Integer; i, i2, iG, iG2, iLevel: Integer; begin Inc(aDelay); if aDelay >= cSpawnDelay then begin aDelay := -1; Actions.OverlayTextSet(-1, 'Killed units:'); for i := 0 to States.LocationCount-1 do if aChoiceLoc[i].aLevel <> 0 then begin i2 := States.StatUnitKilledMultipleTypesCount(i, [14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]); if aChoiceLoc[i].aLevel <> -1 then begin if aChoiceLoc[i].aLevel < cMaxLevel then begin iLevel := (i2 div (cKillsPerLevel+1))+1; if iLevel > aChoiceLoc[i].aLevel then begin Actions.ShowMsg(i, 'Level '+IntToStr(iLevel)+'||You can now choose a more powerful unit!'); aChoiceLoc[i].aLevel := iLevel; aUpdateAvailable(i); end; end; aChoiceLoc[i].aEndLevel := aChoiceLoc[i].aLevel; end; //Overlay texts Actions.OverlayTextAppend(-1, '|'); if aChoiceLoc[i].aLevel = -1 then Actions.OverlayTextAppend(-1, '[$c2c2c2]'); Actions.OverlayTextAppend(-1, IntToStr(i2)+' by '); if aChoiceLoc[i].aLevel <> -1 then Actions.OverlayTextAppend(-1, '[$'+States.PlayerColorText(i)+']'); Actions.OverlayTextAppend(-1, States.PlayerName(i)); if aChoiceLoc[i].aLevel <> -1 then Actions.OverlayTextAppend(-1, '[]'); Actions.OverlayTextAppend(-1, '('+IntToStr(aChoiceLoc[i].aEndLevel)+')'); if aChoiceLoc[i].aLevel = -1 then Actions.OverlayTextAppend(-1, '[]'); if aChoiceLoc[i].aUnit > -1 then begin iG := Actions.GiveGroup(i, aChoiceLoc[i].aUnit, aChoiceLoc[i].aBX, aChoiceLoc[i].aBY, 0, 1, 1); if States.GroupAt(aChoiceLoc[i].aBX, aChoiceLoc[i].aBY) > 0 then begin iG2 := States.GroupAt(aChoiceLoc[i].aBX, aChoiceLoc[i].aBY); if (States.GroupOwner(iG2) = i) AND (iG2 <> iG) AND (States.GroupType(iG2) = States.GroupType(iG)) then begin Actions.GroupOrderLink(iG, iG2); Actions.GroupSetFormation(iG2, Round(Sqrt(States.GroupMemberCount(iG2)))); end; end; end; end; //Making sure the placeholders don't starve iUnits := States.PlayerGetAllUnits(cNeutralPlayer); for i := 0 to Length(iUnits)-1 do Actions.UnitHungerSet(iUnits[i], States.UnitMaxHunger); end; end; procedure OnHouseDestroyed(aHouseID, aDestroyerIndex: Integer); var iP: Integer; begin if States.HouseType(aHouseID) = 21 then begin iP := States.HouseOwner(aHouseID); aChoiceLoc[iP].aLevel := -1; aChoiceLoc[iP].aUnit := -1; Actions.ShowMsg(iP, 'You have been defeated'); Actions.ShowMsg(aDestroyerIndex, States.PlayerName(iP)+' fell before your might!'); end; end;
Just when you think you know something, you have to look at it in another way, even though it may seem silly or wrong. You must try! - John Keating, "Dead Poets Society"
<<

Nightry

Serf

Posts: 7

Joined: 24 Feb 2015, 09:13

KaM Skill Level: Skilled

Post 14 Nov 2015, 06:29

Re: Choose Wisely - map idea

The script is working fine.Only this appears if there are less than 8 players.
players.png
You do not have the required permissions to view the files attached to this post.
<<

Nightry

Serf

Posts: 7

Joined: 24 Feb 2015, 09:13

KaM Skill Level: Skilled

Post 16 Nov 2015, 18:19

Re: Choose Wisely - map idea

Soo...
After a weekend of hard work here it is !

Download and play :D
You do not have the required permissions to view the files attached to this post.

Return to “Map Design”

Who is online

Users browsing this forum: Google [Bot] and 11 guests