/*-- Klippenschubsen --*/ #strict 2 static const MODE_Normal = 0, MODE_ScrollsOnly = 1, MODE_Cancer = 2; static const MENU_Landscape = 0, MENU_Mode = 1, MENU_Settings = 2; static setupDone, setupPlayer; static gameMode; static landscape; static deathmatchEnabled, deathmatchKillLimit; static relaunches, playerScore, teamScore; static g_iSaveSectIndex,szSection; static pChooser,iDif; func Initialize() { // Create background sound, fog and rain SoundLevel("Ambiente", 50); for (var i; i < 300; ++i) { CreateParticle("Fog", Random(LandscapeWidth()), Random(LandscapeHeight()) + 500, RandomX(3, 9), 0, RandomX(1000, 1500)); } CreateObject(RAIN, 0, 0, NO_OWNER); // Moving brick CreateObject(BRK2, 225, 150, NO_OWNER); CreateObject(BRK2, 985, 150, NO_OWNER); // Initial values deathmatchKillLimit = 20; setupDone = false; setupPlayer = -1; relaunches = CreateArray(); playerScore = CreateArray(); teamScore = CreateArray(); // Initialize scoreboard SetScoreboardData(SBRD_Caption, 0, "{{MELE}}"); SetScoreboardData(SBRD_Caption, 1, "{{GBLT}}"); SetScoreboardData(SBRD_Caption, 2, "{{CXIV}}"); DoScoreboardShow(1); ScriptGo(true); } func InitializePlayer(int player) { if (!setupDone && setupPlayer == -1) { setupPlayer = player; ShowSetup(); } /*if (!iDif && GetCrew(GetPlayerCount() - 1)) InitializePlayer2(0); if (!FindObject(DTHM)) relaunches[player] = 10;*/ UpdateScoreboard(); } func RemovePlayer(int player, int team) { playerScore[player] = 0; UpdateScoreboard(); // Player leaves and is still in setup? if (!setupDone && setupPlayer == player) { // Try to find any other player to continue setup for (var i = 0; i < GetPlayerCount(); ++i) { setupPlayer = GetPlayerByIndex(i); if (setupPlayer != player) { ShowSetup(); return; } } } // No other players? setupPlayer = -1; } func ShowSetup(int menuStage, int selection, bool back) { var clonk = GetCrew(setupPlayer); // Clonk already in setup menu? if (clonk->GetMenu()) return; //int CreateMenu (id idSymbol, object pMenuObject, object pCommandObject, int iExtra, string szCaption, int iExtraData, int iStyle, bool fPermanent, id idMenuID); //int AddMenuItem (string szCaption, string szCommand, id idItem, object pMenuObject, int iCount, int iParameter, string szInfoCaption, int iExtra, any XPar1, any XPar2); CreateMenu(ROCK, clonk, 0, C4MN_Extra_None, 0, 0, C4MN_Style_Context); if (menuStage == MENU_Landscape) { clonk->AddMenuItem("Default landscape", "ShowSetup(MENU_Mode, 0)", ROCK); } else if (menuStage == MENU_Mode) { if (!back) landscape = selection; // List modes var modes = [ ["Normal", MODE_Normal], ["Scrolls only", MODE_ScrollsOnly], ["Cancer", MODE_Cancer]]; var itemIndex = 0; for (var mode in modes) { clonk->AddMenuItem(mode[0], Format("ShowSetup(MENU_Settings, %d)", mode[1]), ROCK); if (mode[1] == gameMode) clonk->SelectMenuItem(itemIndex); ++itemIndex; } clonk->AddMenuItem("Back", "ShowSetup(MENU_Landscape, 0, true)", ROCK); } else if (menuStage == MENU_Settings) { if (!back) gameMode = selection; clonk->AddMenuItem("Back", "ShowSetup(MENU_Mode, 0, true)", ROCK); } } func Script2() { // Reopen setup menu if it was closed (by player or runtime join) if (!setupDone && setupPlayer != -1) ShowSetup(); UpdateScoreboard(); goto(1); return 1; } func OnClonkDeath(object clonk, int killedBy) { var isDeathmatch = !!FindObject(DTHM); var player = clonk->GetOwner(); var team = GetPlayerTeam(player); var teamKill = GetPlayerID(killedBy) == 0 || killedBy == player || team != 0 && team == GetPlayerTeam(killedBy); // Killed by opponent? if (!teamKill) { ++playerScore[killedBy]; if (isDeathmatch) CheckDeathmatchKillCount(); } else { // Deathmatch: Decrement score on suicide or team kill. if (isDeathmatch) --playerScore[killedBy]; } // Update relaunch counter if (!isDeathmatch) { // No relaunches left? if (relaunches[player] - 1 < 0) { EliminatePlayer(player); return; } else { --relaunches[player]; } // Show relaunch message. Warn player if it was his last relaunch. if (relaunches[player] == 0) { PlayerMessage(player, "$MsgLastRelaunch$"); } else { PlayerMessage(player, "$MsgRelaunch$", 0, relaunches[player]); } } // Create new clonk at random position var positions = [[168, 120], [301, 150], [914, 150], [1050, 120]]; var position = positions[Random(GetLength(positions))]; var newclonk = CreateObject(CLNK, position[0], position[1], player); newclonk->GrabObjectInfo(clonk); // Armageddon? if (FindObject(FRRN)) { AddEffect("DoTerra", newclonk, 200, 50); AddEffect("Bottom", newclonk, 200, 2); } SelectCrew(player, newclonk, true); } func CheckDeathmatchKillCount() { var gameOver = false; if (GetTeamCount() == 0) { var winner = -1; // Check if a player has reached the kill limit for (var i = 0; i < GetPlayerCount(); ++i) { var plr = GetPlayerByIndex(i); if (playerScore[plr] >= deathmatchKillLimit) { winner = plr; gameOver = true; break; } } // Eliminate other players if there is a winner for (var i = 0; i < GetPlayerCount(); ++i) { var plr = GetPlayerByIndex(i); if (plr != winner) EliminatePlayer(plr); } } else { var winnerTeam = 0; // Clear team score array teamScore = CreateArray(GetTeamCount()); // Calculate team score and check if kill limit is reached for (var i = 0; i < GetPlayerCount(); ++i) { var plr = GetPlayerByIndex(i), team = GetPlayerTeam(plr); teamScore[team] += playerScore[plr]; if (teamScore >= deathmatchKillLimit) { winnerTeam = team; gameOver = true; break; } } // Do we have a winner? if (winnerTeam != 0) { for (var i = 0; i < GetPlayerCount(); ++i) { var plr = GetPlayerByIndex(i); if (GetPlayerTeam(plr) != winnerTeam) EliminatePlayer(plr); } } } UpdateScoreboard(); if (gameOver) GameOver(2014); } func UpdateScoreboard() { for (var plr; plr < GetPlayerCount(); ++plr) { SortScoreboard(0, true); plr = GetPlayerByIndex(plr); SetScoreboardData(plr, 0, GetTaggedPlayerName(plr), relaunches[plr]); SetScoreboardData(plr, 2, Format("%d", playerScore[plr])); if (relaunches[plr] < 0) { SetScoreboardData(plr, 1, Format("%s", "$Death$")); } else if (relaunches[plr] <= 1) { SetScoreboardData(plr, 1, Format("%d", relaunches[plr])); } else { SetScoreboardData(plr, 1, Format("%d", relaunches[plr])); } } } /*-----------------------Spielmodi-----------------------*/ //Auswahl func InitializePlayer2(iPlr) { pChooser=GetHiRank(iPlr); CreateMenu(EFLN,pChooser,0,0,0,0,1); AddMenuItem("$Mode1$","SetDif",ROCK,pChooser,0,1); AddMenuItem("$Mode2$","SetDif",FLRN,pChooser,0,2); AddMenuItem("$Mode3$","SetDif",SMGC,pChooser,0,3); AddMenuItem("$Mode4$","SetDif",FXV1,pChooser,0,4); AddMenuItem("$Random$","SetDif",RMMG,pChooser,0,RandomX(1,4)); return(1); } func SetDif(dummy,i) { if (i == 1) Message("$Mode1$"); if (i == 2) Message("$Mode2$"); if (i == 3) Message("$Mode3$"); if (i == 4) Message("$Mode4$"); if (i==1) CreateObject(SPWN); if (i==2) { Schedule("ChangeSection(\"SuddenDeath\")",10); Message("$Load$"); } if (i==3) { CreateObject(MSPW); SetGamma(RGB(5,5,10),RGB(80,80,150),RGB(200,200,255)); } if (i==4) UltimateExtreme(); return(1); } func UltimateExtreme() { RemoveAll(SPNP); RemoveAll(MSPN); RemoveObject(FindObject(SPWN)); CastObjects(RCKF,10); CreateObject(FRRN); MusicLevel(0); SoundLevel("ExtremeAmbiente",100); SoundLevel("Ambiente",0); for (var Plr;Plr < GetPlayerCount();Plr ++) { relaunches[Plr] = 5; AddEffect("DoTerra",GetHiRank(Plr),200,50); AddEffect("Bottom",GetHiRank(Plr),200,2); } var brick; for (var i;i0;i--) { CreateObject(BRK2,i*90,0); CreateObject(SPNP,Random(LandscapeWidth()),Random(LandscapeHeight()+500)); } CastObjects(CANN,RandomX(10,20),Random(150),LandscapeWidth()/2); CreateObject(RAIN); CreateObject(FLRN); CreateObject(MELE); // Alles gespeicherte wieder herstellen if (g_iSaveSectIndex) while (g_iSaveSectIndex--) if (obj=Global(20+g_iSaveSectIndex)) { obj->SetObjectStatus(1); Global(20+g_iSaveSectIndex)=0; } g_iSaveSectIndex=0; for (var iPlr;iPlrContentsCount(); for (var i = 0; i < contentsCount; ++i) { SaveSectObj(obj->Contents(i)); } // Save object Global(20 + g_iSaveSectIndex++) = obj; obj->SetObjectStatus(C4OS_INACTIVE); } /*-------------- Effects -----------------*/ global func FxDoTerraTimer(object target) { if (target->ContentsCount() < 3) target->CreateContents(EFLN); ShakeViewPort(10); return 1; } global func FxBottomTimer(object target) { if (target->GetY() >= LandscapeHeight() - 20) target->SetPosition(target->GetX() + RandomX(-10, 10), 0); return 1; } global func FxWarStart(object target, int effectNumber) { EffectVar(0, 0, effectNumber) = 255; EffectVar(1, 0, effectNumber) = 1; return 1; } global func FxWarTimer(object target, int effectNumber) { // Remove corpses for (var obj in FindObjects(Find_OCF(OCF_CrewMember), Find_Not(Find_OCF(OCF_Alive)))) { obj->RemoveObject(); } if (EffectVar(1, 0, effectNumber) == 1) { --EffectVar(0, 0, effectNumber); } else { ++EffectVar(0, 0, effectNumber); } if (EffectVar(0, 0, effectNumber) < 0) { EffectVar(1, 0, effectNumber) = 0; } else if (EffectVar(0, 0, effectNumber) > 255) { EffectVar(1, 0, effectNumber) = 1; } var color = EffectVar(0, 0, effectNumber); SetSkyAdjust(RGB(255, color / 2, color / 4), RGB(128, color / 2, color / 4)); SetGamma(RGB(2, 0, 0), RGB(128, color / 2, color / 4), RGB(180, color /2 , color / 4)); return 1; }