add new defense scenario (king of the hill)

This is still experimental and needs some fine-tuning.
alut-include-path
Maikel de Vries 2017-01-15 15:36:58 +01:00
parent 3b1dd87b8b
commit 3f9d06aaa7
14 changed files with 537 additions and 0 deletions

View File

@ -0,0 +1,9 @@
König des Hügels
You have to defend a hill which gives way to a large ruby cave against angry miners.
Ziel: Überlebe möglichst viele Angriffswellen.
Tipps:
- This round is cooperative, so work together and divide tasks.
- Build up a settlement and defense during the earlier rounds of attack.

View File

@ -0,0 +1,9 @@
King of the Hill
You have to defend a hill which gives way to a large ruby cave against angry miners
Goal: Survive as many attack waves as possible.
Hints:
- This round is cooperative, so work together and divide tasks.
- Build up a settlement and defense during the earlier rounds of attack.

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1,241 @@
/* Automatically created objects file */
func InitializeObjects()
{
var Grass001 = CreateObjectAbove(Grass, 4, 334);
var Grass002 = CreateObjectAbove(Grass, 11, 333);
var Grass003 = CreateObjectAbove(Grass, 19, 333);
var Grass004 = CreateObjectAbove(Grass, 26, 333);
var Grass005 = CreateObjectAbove(Grass, 31, 332);
var Grass006 = CreateObjectAbove(Grass, 40, 335);
var Grass007 = CreateObjectAbove(Grass, 41, 334);
var Grass008 = CreateObjectAbove(Grass, 32, 486);
var Grass009 = CreateObjectAbove(Grass, 44, 486);
var Grass010 = CreateObjectAbove(Grass, 41, 486);
var Grass011 = CreateObjectAbove(Grass, 48, 485);
var Grass012 = CreateObjectAbove(Grass, 54, 485);
var Grass013 = CreateObject(Grass, 60, 485);
var Grass014 = CreateObjectAbove(Grass, 72, 486);
var Grass015 = CreateObjectAbove(Grass, 67, 486);
var Grass016 = CreateObjectAbove(Grass, 96, 486);
var Grass017 = CreateObjectAbove(Grass, 97, 488);
var Grass018 = CreateObject(Grass, 105, 486);
var Grass019 = CreateObject(Grass, 114, 487);
var Grass020 = CreateObjectAbove(Grass, 121, 487);
var Grass021 = CreateObjectAbove(Grass, 125, 487);
var Grass022 = CreateObjectAbove(Grass, 131, 488);
var Grass023 = CreateObjectAbove(Grass, 137, 487);
var Grass024 = CreateObject(Grass, 141, 487);
var Grass025 = CreateObjectAbove(Grass, 795, 758);
var Grass026 = CreateObjectAbove(Grass, 802, 758);
var Grass027 = CreateObjectAbove(Grass, 808, 760);
var Grass028 = CreateObjectAbove(Grass, 819, 759);
var Grass029 = CreateObjectAbove(Grass, 835, 759);
var Grass030 = CreateObjectAbove(Grass, 830, 758);
var Grass031 = CreateObjectAbove(Grass, 814, 757);
var Grass032 = CreateObject(Grass, 826, 758);
var Grass033 = CreateObjectAbove(Grass, 845, 758);
var Grass034 = CreateObjectAbove(Grass, 853, 758);
var Grass035 = CreateObject(Grass, 862, 759);
var Grass036 = CreateObjectAbove(Grass, 873, 757);
var Grass037 = CreateObjectAbove(Grass, 881, 759);
var Grass038 = CreateObjectAbove(Grass, 887, 758);
var Grass039 = CreateObjectAbove(Grass, 894, 758);
var Grass040 = CreateObjectAbove(Grass, 903, 758);
var Grass041 = CreateObjectAbove(Grass, 914, 758);
var Grass042 = CreateObjectAbove(Grass, 925, 758);
var Grass043 = CreateObjectAbove(Grass, 937, 758);
var Grass044 = CreateObjectAbove(Grass, 941, 758);
var Grass045 = CreateObjectAbove(Grass, 947, 757);
var Grass046 = CreateObjectAbove(Grass, 956, 757);
var Grass047 = CreateObjectAbove(Grass, 932, 757);
var Grass048 = CreateObjectAbove(Grass, 871, 758);
var Torch001 = CreateObjectAbove(Torch, 493, 901);
Torch001->AttachToWall(false);
var Torch002 = CreateObjectAbove(Torch, 898, 929);
Torch002->AttachToWall(false);
CreateObjectAbove(Vine, 423, 516);
CreateObjectAbove(Vine, 67, 421);
var Trunk001 = CreateObject(Trunk, 72, 311);
Trunk001->SetCon(97);
Trunk001->SetR(42);
var Flower001 = CreateObjectAbove(Flower, 808, 765);
var Flower002 = CreateObjectAbove(Flower, 834, 766);
CreateObjectAbove(Flower, 879, 765);
var Flower003 = CreateObjectAbove(Flower, 919, 765);
CreateObjectAbove(Flower, 946, 763);
var Flower004 = CreateObjectAbove(Flower, 60, 492);
CreateObjectAbove(Flower, 35, 339);
CreateObjectAbove(Tree_Deciduous, 915, 763);
CreateObjectAbove(Tree_Deciduous, 898, 761);
CreateObjectAbove(Tree_Deciduous, 902, 762);
CreateObjectAbove(Tree_Deciduous, 844, 763);
CreateObjectAbove(Tree_Deciduous, 849, 763);
CreateObjectAbove(Tree_Deciduous, 944, 761);
CreateObjectAbove(Tree_Deciduous, 802, 764);
CreateObjectAbove(Tree_Deciduous, 28, 338);
CreateObjectAbove(Tree_Coniferous2, 868, 763);
CreateObjectAbove(Tree_Coniferous2, 826, 764);
CreateObjectAbove(Tree_Coniferous2, 8, 340);
CreateObjectAbove(Tree_Coniferous3, 928, 763);
CreateObjectAbove(Tree_Coniferous3, 810, 763);
var Wheat001 = CreateObjectAbove(Wheat, 808, 759);
Wheat001->SetMeshMaterial("wheat_material_ripe", 0);
var Wheat002 = CreateObjectAbove(Wheat, 822, 759);
Wheat002->SetMeshMaterial("wheat_material_ripe", 0);
var Wheat003 = CreateObjectAbove(Wheat, 821, 758);
Wheat003->SetMeshMaterial("wheat_material_ripe", 0);
var Wheat004 = CreateObjectAbove(Wheat, 813, 758);
Wheat004->SetMeshMaterial("wheat_material_ripe", 0);
CreateObjectAbove(Cotton, 32, 334);
CreateObjectAbove(Cotton, 9, 335);
var Branch001 = CreateObject(Branch, 360, 435);
Branch001->SetR(-12);
var Branch002 = CreateObject(Branch, 45, 456);
Branch002->SetCon(77);
Branch002->SetR(107);
var Branch003 = CreateObject(Branch, 59, 419);
Branch003->SetCon(87);
Branch003->SetR(63);
var Branch004 = CreateObject(Branch, 61, 397);
Branch004->SetCon(74);
Branch004->SetR(82);
var Branch005 = CreateObject(Branch, 89, 347);
Branch005->SetCon(103);
Branch005->SetR(106);
var Branch006 = CreateObject(Branch, 458, 398);
Branch006->SetCon(106);
Branch006->SetR(39);
var Branch007 = CreateObject(Branch, 449, 437);
Branch007->SetCon(98);
Branch007->SetR(137);
var Branch008 = CreateObject(Branch, 446, 463);
Branch008->SetCon(104);
Branch008->SetR(157);
var Branch009 = CreateObject(Branch, 390, 498);
Branch009->SetCon(94);
Branch009->SetR(166);
var Branch010 = CreateObject(Branch, 217, 674);
Branch010->SetCon(105);
Branch010->SetR(140);
var ToolsWorkshop001 = CreateObjectAbove(ToolsWorkshop, 210, 622);
var Basement001 = CreateObject(Basement, 210, 627);
Basement001->SetParent(ToolsWorkshop001);
var ChemicalLab001 = CreateObjectAbove(ChemicalLab, 160, 622);
var Basement002 = CreateObject(Basement, 160, 627);
Basement002->SetParent(ChemicalLab001);
var Armory001 = CreateObjectAbove(Armory, 217, 717);
var Basement003 = CreateObject(Basement, 215, 723);
Basement003->SetParent(Armory001);
var SteamEngine001 = CreateObject(SteamEngine, 134, 695);
var Basement004 = CreateObject(Basement, 135, 723);
Basement004->SetParent(SteamEngine001);
var Elevator001 = CreateObjectAbove(Elevator, 104, 487);
Elevator001->SetDir(DIR_Right);
Elevator001->CreateShaft(0);
Elevator001->SetCasePosition(476);
var Basement005 = CreateObject(Basement, 115, 492);
Basement005->SetParent(Elevator001);
var Flagpole001 = CreateObject(Flagpole, 136, 454);
var Basement006 = CreateObject(Basement, 136, 492);
Basement006->SetParent(Flagpole001);
var Chest001 = CreateObjectAbove(Chest, 18, 335);
var WindGenerator001 = CreateObject(WindGenerator, 392, 392);
var WindGenerator002 = CreateObject(WindGenerator, 429, 383);
var Lorry001 = CreateObjectAbove(Lorry, 124, 621);
CreateObjectAbove(Catapult, 200, 471);
CreateObject(Rock, 170, 546);
CreateObject(Rock, 62, 505);
CreateObject(Rock, 95, 639);
CreateObject(Rock, 100, 668);
CreateObject(Rock, 260, 752);
CreateObject(Rock, 239, 744);
CreateObject(Rock, 190, 814);
CreateObject(Rock, 116, 757);
CreateObject(Rock, 392, 808);
CreateObject(Rock, 265, 890);
CreateObject(Rock, 171, 872);
CreateObject(Rock, 338, 869);
CreateObject(Rock, 923, 775);
CreateObject(Rock, 873, 778);
Lorry001->CreateContents(Ore, 4);
Lorry001->CreateContents(Coal, 4);
SteamEngine001->CreateContents(Coal, 4);
CreateObject(Loam, 191, 544);
CreateObject(Loam, 292, 751);
CreateObject(Loam, 374, 846);
CreateObject(Loam, 920, 909);
CreateObject(Loam, 176, 855);
CreateObject(Loam, 58, 703);
ToolsWorkshop001->CreateContents(Metal, 6);
Armory001->CreateContents(Metal, 4);
ToolsWorkshop001->CreateContents(Wood, 5);
Armory001->CreateContents(Wood, 6);
Lorry001->CreateContents(Wood, 4);
Chest001->CreateContents(Blunderbuss);
Chest001->CreateContents(LeadBullet, 3);
Chest001->CreateContents(Bow);
Chest001->CreateContents(FireArrow, 3);
Lorry001->CreateContents(Shovel, 2);
ToolsWorkshop001->CreateContents(Shovel, 2);
ChemicalLab001->CreateContents(DynamiteBox, 2);
ToolsWorkshop001->CreateContents(Lantern);
Armory001->CreateContents(Lantern);
Lorry001->CreateContents(Axe, 2);
Lorry001->CreateContents(Hammer, 2);
Lorry001->CreateContents(Pickaxe, 2);
CreateObject(Firestone, 65, 547);
CreateObject(Firestone, 141, 511);
CreateObject(Firestone, 262, 607);
CreateObject(Firestone, 63, 643);
CreateObject(Firestone, 157, 763);
CreateObject(Firestone, 82, 871);
CreateObject(Firestone, 204, 811);
CreateObject(Firestone, 258, 876);
CreateObject(Firestone, 244, 868);
CreateObject(Firestone, 278, 815);
CreateObject(Firestone, 321, 748);
CreateObject(Firestone, 405, 714);
CreateObject(Firestone, 408, 807);
CreateObject(Firestone, 371, 909);
CreateObject(Firestone, 897, 945);
CreateObject(Firestone, 953, 911);
return true;
}

View File

@ -0,0 +1,29 @@
[Head]
Icon=13
Title=KingOfTheHill
Version=8
Difficulty=1
MaxPlayerLeague=1
MinPlayer=1
NoInitialize=true
[Player1]
[Player2]
[Player3]
[Player4]
[Landscape]
Sky=Clouds2
BottomOpen=1
MapWidth=120,0,64,10000
MapHeight=120,0,40,10000
SkyScrollMode=2
[Weather]
Climate=0,0,0,100
StartSeason=0,0,0,100
YearSpeed=0,0,0,100
Wind=1,100,-100,100

View File

@ -0,0 +1,135 @@
/**
King of the Hill
Defend the hill from enemy waves.
@author Maikel
*/
static init_defenders;
static g_enemy_plr;
protected func Initialize()
{
CreateScriptPlayer("$PlayerAttackers$", nil, 2, CSPF_NoEliminationCheck);
CreateObject(Goal_Defense);
CreateObject(Rule_BuyAtFlagpole);
CreateObject(Rule_BaseRespawn);
CreateObject(Rule_TeamAccount);
CreateObject(Rule_NoFriendlyFire);
return;
}
/*-- Player Control --*/
protected func InitializePlayer(int plr)
{
// Do script player.
if (GetPlayerType(plr) != C4PT_User)
{
g_enemy_plr = plr;
GetCrew(plr)->RemoveObject();
return;
}
// Move players to defenders team.
if (GetPlayerTeam(plr) != 1)
SetPlayerTeam(plr, 1);
// Move crew to the island.
var crew = GetCrew(plr);
crew->SetPosition(128, 440);
// Set zoom ranges.
SetPlayerZoomByViewRange(plr, 1200, nil, PLRZOOM_LimitMax);
SetPlayerZoomByViewRange(plr, 450, nil, PLRZOOM_Direct);
// Base material and knowledge.
GivePlayerBaseMaterial(plr);
var index = 0, def;
while (def = GetDefinition(index++))
SetPlrKnowledge(plr, def);
// Give base and set wealth.
if (!init_defenders)
{
SetWealth(plr, 200);
for (var obj in FindObjects(Find_Func("IsFlagpole")))
obj->SetOwner(plr);
init_defenders = true;
}
return;
}
public func GetEnemyPlayer() { return g_enemy_plr; }
/*-- Waves Control --*/
public func GetAttackWave(int nr)
{
// The round starts with a short phase to prepare.
if (nr == 1) return new DefenseWave.Break { Duration = 120 };
// Attack positions.
var pos_land = {X = LandscapeWidth(), Y = 740, Exact = true};
var pos_sky = {X = LandscapeWidth() - 100, Y = 0};
var pos_above = {X = 200, Y = 0};
// Automatically build waves that become stronger.
var wave =
{
Name = "$MsgWave$",
// Waves last shorter as the number increases.
Duration = BoundBy(120 - nr / 3, 20, 120),
Bounty = 100,
Score = 100,
Enemies = []
};
// Add enemy ground troups: swordsman, archer or spearman.
if (nr % 3 == 0)
{
PushBack(wave.Enemies, new DefenseEnemy.Swordsman {
Amount = BoundBy(nr - 1, 1, 20),
Energy = BoundBy(20 + nr, 30, 100),
Position = pos_land
});
}
if (nr % 3 == 1)
{
PushBack(wave.Enemies, new DefenseEnemy.Archer {
Amount = BoundBy(nr - 1, 1, 20),
Energy = BoundBy(10 + nr, 20, 50),
Position = pos_land
});
}
if (nr % 3 == 2)
{
PushBack(wave.Enemies, new DefenseEnemy.Spearman {
Amount = BoundBy(nr - 1, 1, 20),
Energy = BoundBy(10 + nr, 20, 50),
Position = pos_land
});
}
// Add enemy: boom attack.
PushBack(wave.Enemies, new DefenseEnemy.BoomAttack {
Amount = BoundBy(nr - 1, 1, 20),
Speed = BoundBy(80 + nr * 5, 100, 250),
Position = pos_sky
});
// Add enemy: rocketeer.
PushBack(wave.Enemies, new DefenseEnemy.Rocketeer {
Amount = BoundBy(nr - 1, 1, 20),
Inventory = [Bow, RandomElement([Arrow, FireArrow, BombArrow])],
Position = pos_sky
});
return wave;
}
// The attackers should go for flagpoles.
public func GiveRandomAttackTarget(object attacker)
{
return FindObject(Find_Category(C4D_Structure), Find_Func("IsFlagpole"), Find_Hostile(attacker->GetController()), Sort_Random());
}

View File

@ -0,0 +1,4 @@
TeamAttackers=Angreiffer
TeamDefenders=Verteidiger
PlayerAttackers=Angreiffer
MsgWave=Angriff!

View File

@ -0,0 +1,4 @@
TeamAttackers=Attackers
TeamDefenders=Defenders
PlayerAttackers=Attackers
MsgWave=Attack!

View File

@ -0,0 +1,62 @@
// Base material for the player.
global func GivePlayerBaseMaterial(int plr)
{
var base_mats = [
// Clonks & health.
[Clonk, 20, 10],
[Bread, 20, 10],
// Materials & mining.
[Wood, 16, 8],
[Metal, 16, 8],
[Rock, 16, 8],
[Cloth, 8, 4],
[Loam, 8, 4],
[Firestone, 8, 4],
[Dynamite, 8, 4],
// Essential tools.
[Shovel, 4, 4],
[Hammer, 2, 2],
[Axe, 2, 2],
[Pickaxe, 2, 2],
// Additional tools.
[Barrel, 2, 2],
[MetalBarrel, 2, 2],
[Bucket, 2, 2],
[Torch, 2, 2],
[Pipe, 2, 2],
[WallKit, 1, 1],
// Advanced tools.
[Ropeladder, 2, 1],
[GrappleBow, 2, 1],
[Balloon, 2, 1],
[TeleGlove, 1, 1],
[WindBag, 1, 1],
[Boompack, 1, 1],
// Weapons.
[Bow, 2, 1],
[Arrow, 8, 8],
[Shield, 2, 1],
[Javelin, 2, 1],
[Club, 2, 1],
[Sword, 2, 1],
// Advanced weapons.
[FireArrow, 2, 2],
[BombArrow, 2, 2],
[Blunderbuss, 2, 1],
[LeadBullet, 4, 4],
[GrenadeLauncher, 1, 1],
[IronBomb, 4, 4],
[SmokeBomb, 2, 2],
[Lantern, 2, 2],
[Catapult, 1, 1],
[PowderKeg, 4, 1],
[Cannon, 1, 1]
];
for (var mat in base_mats)
{
DoBaseMaterial(plr, mat[0], mat[1]);
DoBaseProduction(plr, mat[0], mat[2]);
}
return;
}

View File

@ -0,0 +1,11 @@
// Add energy bar and hitpoints to flagpoles.
#appendto Flagpole
public func Initialize()
{
AddEnergyBar();
return _inherited(...);
}
local HitPoints = 400;

View File

@ -0,0 +1,19 @@
// Add no friendly fire to these objects.
#appendto Flagpole
public func Construction()
{
// Notify friendly fire rule.
GameCallEx("OnCreationRuleNoFF", this);
return _inherited(...);
}
public func Destruction()
{
// Notify friendly fire rule.
GameCallEx("OnDestructionRuleNoFF", this);
return _inherited(...);
}
local HasNoFriendlyFire = true;

View File

@ -0,0 +1,12 @@
[Teams]
[Team]
id=1
Name=$TeamDefenders$
Color=4294180864
[Team]
id=2
Name=$TeamAttackers$
Color=4278241280
MaxPlayer=1

View File

@ -0,0 +1,2 @@
DE:König des Hügels
US:King of the Hill