Alternatives Belohnungssystem in Form von "Cheats"

» Siedler Map Source Forum » Siedler DEdK Script Forum » Alternatives Belohnungssystem in Form von "Cheats"

Seiten: 1

fritz_98
#1
12.02.2010 18:19
Beiträge: 472

Alternatives Belohnungssystem in Form von "Cheats"

Achtung! Dies ist keine Comfortfunktion!

Manchmal möchte man den Spieler doch auch belohnen, wenn er eine Quest gewonnen hat. (Vllt eine freiwillige Quest?)

Und weil er so fleissig war, bekommt er einen Cheatcode, den er im Pausefenster eingeben kann. Ob er diesen nun nur einmal oder dutzendmal eingeben kann, bleibt allein dem Mapper überlassen.

Hier ein kleines Anwendungsbeispiel:

--Das in die FMA:
function FirstMapAction()
  Cheaz_Variablen()
end
--Das irgendwoanders hin... 100% anpassbar.
function Cheaz_Variablen()
  pause_cheat1Used = false
  pause_cheat2Used = false
  pause_cheat3Used = false
  pause_cheat4Used = false
end
KeyPauseOld=KeyBindings_TogglePause 
KeyBindings_TogglePause=function()
  if pausecount == 0 then
	XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "ChatInput" ), 1 )
	GameCallback_GUI_ChatStringInputDone = function(_N)
		pause_cheatinput = _N
	end
	KeyPauseOld()
	pausecount = 1
  elseif pausecount == 1 then
	if string.upper(pause_cheatinput) == "AN OLD MAN FROM CALCUTTA" and pause_cheat1Used == false then
		local mouseX, mouseY = GUI.Debug_GetMapPositionUnderMouse()
		local g = Logic.WorldGetSize()
		data={Logic.GetPlayerEntitiesInArea(1,Entities.PB_Headquarters1, mouseX, mouseY, g*10, 16)}
		local pos = GetPosition(data[2])
		Tools.CreateGroup(1,Entities.PU_LeaderSword3,8,pos.X - 900,pos.Y,180)
		Message("Ein kleiner Trupp steht vor Eurem Haupthaus!")
		pause_cheat1Used = true
	elseif string.upper(pause_cheatinput) == "JUST FOR ONE MOMENT" and pause_cheat2Used == false then
		local mouseX, mouseY = GUI.Debug_GetMapPositionUnderMouse()
		local g = Logic.WorldGetSize()
		data={Logic.GetPlayerEntitiesInArea(1,Entities.PB_Headquarters1, mouseX, mouseY, g*10, 16)}
		local pos = GetPosition(data[2])
		Tools.CreateGroup(1,Entities.PU_LeaderSword3,8,pos.X - 900,pos.Y,180)
		Tools.CreateGroup(1,Entities.PU_LeaderBow3,8,pos.X - 1200,pos.Y,180)
		Message("Ein mittelgrosser Trupp steht vor Eurem Haputhaus!")
		pause_cheat2Used = true
	elseif string.upper(pause_cheatinput) == "WHEN YOU ARE NOT IN TIME" and pause_cheat3Used == false then
		local mouseX, mouseY = GUI.Debug_GetMapPositionUnderMouse()
		local g = Logic.WorldGetSize()
		data={Logic.GetPlayerEntitiesInArea(1,Entities.PB_Headquarters1, mouseX, mouseY, g*10, 16)}
		local pos = GetPosition(data[2])
		Tools.CreateGroup(1,Entities.PU_LeaderSword3,8,pos.X - 900,pos.Y,180)
		Tools.CreateGroup(1,Entities.PU_LeaderBow3,8,pos.X - 1200,pos.Y,180)
		Tools.CreateGroup(1,Entities.PU_LeaderPoleArm3,8,pos.X - 1050,pos.Y+250,180)
		Tools.CreateGroup(1,Entities.PU_LeaderPoleArm3,8,pos.X - 1050,pos.Y-250,180)
		Message("Ein grosser Trupp steht vor Eurem Haputhaus!")
		pause_cheat3Used = true
	elseif string.upper(pause_cheatinput) == "A REAL FRIEND" and pause_cheat4Used == false then
		local mouseX, mouseY = GUI.Debug_GetMapPositionUnderMouse()
		local g = Logic.WorldGetSize()
		data={Logic.GetPlayerEntitiesInArea(1,Entities.PB_Headquarters1, mouseX, mouseY, g*10, 16)}
		local pos = GetPosition(data[2])
		Tools.CreateGroup(1,Entities.PU_LeaderSword3,8,pos.X - 900,pos.Y,180)
		Tools.CreateGroup(1,Entities.PU_LeaderBow3,8,pos.X - 1200,pos.Y,180)
		Tools.CreateGroup(1,Entities.PU_LeaderPoleArm3,8,pos.X - 1050,pos.Y+250,180)
		Tools.CreateGroup(1,Entities.PU_LeaderPoleArm3,8,pos.X - 1050,pos.Y-250,180)
		Tools.CreateGroup(1,Entities.PU_LeaderHeavyCavalry2,4,pos.X - 1200,pos.Y+500,180)
		Tools.CreateGroup(1,Entities.PU_LeaderHeavyCavalry2,4,pos.X - 1200,pos.Y-500,180)
		Tools.CreateGroup(1,Entities.PU_LeaderCavalry2,4,pos.X - 900,pos.Y+500,180)
		Tools.CreateGroup(1,Entities.PU_LeaderCavalry2,4,pos.X - 900,pos.Y-500,180)
		Message("Eine kleine Armee steht vor Eurem Haputhaus!")
		pause_cheat4Used = true
	end
	KeyPauseOld()
	XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "ChatInput" ), 0 )
	pause_cheatinput = "Fritz"
    pausecount = 0
  end
end


Ihr könnt genau erkennen, was passiert: Sobald ein bestimmter Satz im Pausefenster eingegeben wird, erscheinen so und so viele Truppen vor dem Haupthaus (hier eine Burg, wie gesagt: anpassbar!)
Diese Codes sollten möglichst "intelligente" Sätze sein, die eigentlich wenig mit der Sache zu tun haben.

Nochmal: Mir ging es hier mehr um die Idee, macht mit dem Beispiel oben, was ihr wollt.

LG
Fritz

kingsia
#2
12.02.2010 18:42
Beiträge: 750

Exzellente Idee!!!!!
Ich liebe es.

Gruss
Kingsia

warrior1024
#3
12.02.2010 18:52
Beiträge: 345

Wieso nur Truppen?

Gute Idee,

was man damit machen könnte! Man könnte Steine zerstören(Weg zu neuen Gebieten), Ressourcen wiederauffüllen, Ressourcen dem Spieler überlassen, man könnte sogar dafür sorgen, dass Einheiten billiger werden(per Logic-Funktionen), man könnte Technologien freischalten, man könnte ein Militärgebäude des Gegners zerstören und und und...

Tolle Idee!

____________________
"Banken machen keine Fehlentscheidungen! Haben Euch das Eure Eltern nicht beigebracht?"
- Bankier Samael Silren, Enderal

fritz_98
#4
12.02.2010 18:54
Beiträge: 472

Einstellungsache.

Ach ja, noch eins vergessen zu sagen:

Das hier muss auch noch in die FMA:

pausecount = 0


Sonst bekommt ihr einen Error.

Fritz

kingsia
#5
12.02.2010 19:05
Beiträge: 750

Was man auch damit machen könnte (aber das wird wirklich fies) ist der Karte so erstellen dass es nur zu gewinnen ist wenn man mit Hilfe diese "Cheats" "mogelt".

Es wird manche Spieler fast zum Wahnsinn bringen wenn sie ständig versuchen die Karte zu gewinnen, ohne Hilfe von diese "Cheats", wenn es dabei überhaupt nicht möglich ist.

Gruss
Kingsia

andre111
#6
12.02.2010 19:58
Beiträge: 220

Als Comfort-function:

Ich habs mal in ne comfort function "verwandelt":

--Das in die FMA:
function FirstMapAction()
  Cheaz_Variablen("HALLO",cheat1,"BUHU",cheat2,"BLABLA",cheat3,"HEHEHE",cheat4)
  --Die Cheateingabe wird mit folgenden functionen gestartet:
  --1)Wird "HALLO" eingegeben, wird die function cheat1() aufgerufen
  --2)Wird "BUHU" eingegeben, wird die function cheat2() aufgerufen
  --3)...
  --4)...
  --Die Cheats können wärend der Pause eingegeben werden.
end
--Das irgendwoanders hin...
function Cheaz_Variablen(_name1,_cal1,_name2,_cal2,_name3,_cal3,_name4,_cal4)
  pausecount = 0
  pause_cheat1Used = false
  pause_cheat2Used = false
  pause_cheat3Used = false
  pause_cheat4Used = false
  aktivCheats(_name1,_cal1,_name2,_cal2,_name3,_cal3,_name4,_cal4)
end
function aktivCheats(_a,_aC,_b,_bC,_c,_cC,_d,_dC)
CheatTable = {
{text = _a,callb = _aC},
{text = _b,callb = _bC},
{text = _c,callb = _cC},
{text = _d,callb = _dC},
}
KeyPauseOld=KeyBindings_TogglePause 
KeyBindings_TogglePause=function()
  if pausecount == 0 then
	XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "ChatInput" ), 1 )
	GameCallback_GUI_ChatStringInputDone = function(_N)
		pause_cheatinput = _N
	end
	KeyPauseOld()
	pausecount = 1
  elseif pausecount == 1 then
	if string.upper(pause_cheatinput) == CheatTable[1].text and pause_cheat1Used == false then
		CheatTable[1].callb()
		pause_cheat1Used = true
	elseif string.upper(pause_cheatinput) == CheatTable[2].text and pause_cheat2Used == false then
		CheatTable[2].callb()
		pause_cheat2Used = true
	elseif string.upper(pause_cheatinput) == CheatTable[3].text and pause_cheat3Used == false then
		CheatTable[3].callb()
		pause_cheat3Used = true
	elseif string.upper(pause_cheatinput) == CheatTable[4].text and pause_cheat4Used == false then
		CheatTable[4].callb()
		pause_cheat4Used = true
	end
	KeyPauseOld()
	XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "ChatInput" ), 0 )
	pause_cheatinput = "Fritz"
    pausecount = 0
  end
end
end



Erklährung steht im script!
vieleicht kann man es so einfacher nutzen.

FG
andre111

Dieser Beitrag wurde von andre111 am 13.02.2010 um 09:30 editiert.

aCid
#7
13.02.2010 00:39
Beiträge: 275

respekt!!!

____________________
Das ist und bleibt ein Spiel! - Wir sind hier nicht vor Gericht.
----------------------------------------------------------------------
Mapperhilfen für S5:
http://www.siedler-maps.de/forum/Siedler-DEdK-Script-Forum-27/index.htm
http://www.siedler-maps.de/for...und-andere-Ressourcen-8688.htm
http://www.siedler-maps.de/for...unktionen-Skripte-etc-8706.htm

fritz_98
#8
13.02.2010 10:31
Beiträge: 472

@andre:
Nur 4 "Cheats" wären möglich.

Ausserdem braucht die Pause-Funktion insgesamt nur einmal verändert werden, weshalb sich bei einer Comfortfunktion insgesamt nicht viel schenken würde.

andre111
#9
13.02.2010 11:47
Beiträge: 220

@fritz 98:

Stimmt! Deswegen habe ich die function nochmal umgeschrieben:

Der Vorteil: Man kann einen neuen Cheats irgendwann im Verlauf erstellen.
Erklährung steht wieder im Script:

 --###########################
--In die FMA:
--aktivCheats()
--###########################
--Aufruf zum erstellen eines Cheats:
--_text : Was eingegeben werden muss
--_callback: Die function die bei richtiger eingabe aufgerufen wird. 
--Bsp: AddCheat("HALLO",cheat1)

--In den Script:
function AddCheat(_text,_callback)
table.insert(CheatTable,{text = _text,callb = _callback,used = false})
end

function aktivCheats()
pausecount = 0
CheatTable = {}
KeyPauseOld=KeyBindings_TogglePause 
KeyBindings_TogglePause=function()
  if pausecount == 0 then
	XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "ChatInput" ), 1 )
	GameCallback_GUI_ChatStringInputDone = function(_N)
		pause_cheatinput = _N
	end
	KeyPauseOld()
	pausecount = 1
  elseif pausecount == 1 then
    cheatGeben = false
    for i = 1,table.getn(CheatTable) do
	if string.upper(pause_cheatinput) == CheatTable[i].text and CheatTable[i].used == false then
		CheatTable[i].callb()
		CheatTable[i].used  = true
		cheatGeben = true
	elseif string.upper(pause_cheatinput) == CheatTable[i].text and CheatTable[i].used == true then
		Message("Du hast diesen Cheat bereits verwendet!")
		cheatGeben = true
	elseif i == table.getn(CheatTable) and not cheatGeben then
		Message("Dieser Cheat existiert nicht. \195\156berpr\195\188fe deine Eingabe!")
	end
	end
	KeyPauseOld()
	XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "ChatInput" ), 0 )
	pause_cheatinput = "Fritz"
    pausecount = 0
  end
end
end



@fritz 98: Wenn der Code immernoch Nachteile hat kannstes mir ja wieder sagen.

FG
andre111

Dieser Beitrag wurde von andre111 am 13.02.2010 um 11:59 editiert.

aCid
#10
13.02.2010 19:02
Beiträge: 275

statt used auf true zu stellen, kannst auch gleich per remove den eintrag entfernen.
wird der durchlauf immer kuerzer.

____________________
Das ist und bleibt ein Spiel! - Wir sind hier nicht vor Gericht.
----------------------------------------------------------------------
Mapperhilfen für S5:
http://www.siedler-maps.de/forum/Siedler-DEdK-Script-Forum-27/index.htm
http://www.siedler-maps.de/for...und-andere-Ressourcen-8688.htm
http://www.siedler-maps.de/for...unktionen-Skripte-etc-8706.htm

andre111
#11
13.02.2010 19:31
Beiträge: 220

Zitat von aCid:
statt used auf true zu stellen, kannst auch gleich per remove den eintrag entfernen.
wird der durchlauf immer kuerzer.



@aCid:
Ja, aber dann kommt immer die Nachricht,dass der Cheat nicht existiert.(manche werden dann wahrscheinlich verrückt, und fragen sich warum der Cheat nicht functioniert. So wird mitgeteilt, dass der Cheat zwar existiert, aber nicht mehr verwendet werden kann)

FG
andre111

Seiten: 1

SiteEngine v1.5.0 by nevermind, ©2005-2007
Design by SpiderFive (www.siedler-games.de) - English translation by juja

Impressum