- Joined
- Nov 30, 2007
- Messages
- 1,202
I finnished the core of my diplomacy library. I would like some feedback on it and if you have two computers perhaps you could test it. (I would test for bugs myself, but I can't find the map saved in the "test" or "scenario" folder. The one thing i can't test is to neutral another player. If someone could try that on another computer I'd be truly thankful.
Player commands: all, faction name, player number (1-12) and color
To see commands in game type: "-d" or "-diplomacy"
Any feedback on The trigger, the messages, the sound or other things I should change - do tell.
I don't know if "PenDex" is the best solution to keep track of pending offers... but it stands for now.
Not sure what more to implement that I haven't already planned for (alliance, alliance limit, give gold/lumber and tax it).
Attached the map below.
Player commands: all, faction name, player number (1-12) and color
To see commands in game type: "-d" or "-diplomacy"
Any feedback on The trigger, the messages, the sound or other things I should change - do tell.
I don't know if "PenDex" is the best solution to keep track of pending offers... but it stands for now.
Not sure what more to implement that I haven't already planned for (alliance, alliance limit, give gold/lumber and tax it).
JASS:
library Diplomacy initializer init
globals
//
private constant real DISPLAY_TIME = 10.
private constant integer PENDING_TIME = 15
private constant real Give_Gold_Tax = 0.1
private constant real Give_Wood_Tax = 0.1
integer AllyLimit = 1 // You can change this through outside triggers.
//
private timer array Timer
private boolean array PendingOffer
private integer array Offering
private integer array Recieving
private string array Faction
private force Active = CreateForce()
private hashtable hash = InitHashtable()
private player cmd_p
private integer array AllyCount //Should I cound the allies in the beginning? What happens if full?
private sound s_Offer
private sound s_Peace
private sound s_War
private sound s_Ally
endglobals
private function SetWords takes nothing returns nothing
local string s = StringCase(GetEventPlayerChatString(), false)
local string array word
local integer i = 1
local integer j = 0
set i = 0
loop
exitwhen i > StringLength(s)
if (SubString(s,i, i+1) == " ") then
set j = j + 1
else
set word[j] = word[j] + SubString(s,i,i+1)
endif
set i = i + 1
endloop
if word[1] == "dark" or word[1] == "light" then
set word[1] = word[1] + " " + word[2]
set i = 2
loop
exitwhen word[i+1] == null
set word[i] = word[i+1]
set i = i + 1
endloop
endif
set cmd_p = Player(LoadInteger(hash, 0, StringHash(word[1])))
if (cmd_p == Player(0) and word[1] != "1" and word[1] != "red" and word[1] != "sparta") then
set cmd_p = null
endif
endfunction
private function DisplayFaction takes string factions returns string
local integer i = 0
local integer j = 0
local string s = SubString(factions, 0, StringLength(factions)-1)
loop
exitwhen i > StringLength(s)
if (SubString(s, i, i+1) == " ") then
set j = i
endif
set i = i + 1
endloop
if (j > 1) then
set s = SubString(s, 0, j-1) + " and " + SubString(s, j+1, StringLength(s))
endif
return s
endfunction
//******************************//
// Offers //
//******************************//
private function DisplayExpiredMsg takes nothing returns nothing
endfunction
private function RemoveOffer takes integer f returns nothing
call PauseTimer(Timer[f])
call DestroyTimer(Timer[f])
set PendingOffer[f] = false
endfunction
private function OfferExpires takes nothing returns nothing
local integer tID = LoadInteger(hash, GetHandleId(GetExpiredTimer()), 0)
call RemoveOffer(tID)
if (tID <= 144) then
call DisplayTimedTextToPlayer(Player(Offering[tID]), 0,0, DISPLAY_TIME, "Your Peace offer to " + Faction[Recieving[tID]] + " has expired.")
call DisplayTimedTextToPlayer(Player(Recieving[tID]), 0,0, DISPLAY_TIME, Faction[Offering[tID]] + "'s Peace offer has expired.\n")
//set msg_n[PenDexPlayer_1[i]] = msg_n[PenDexPlayer_1[i]] + " " + Faction[PenDexPlayer_2[i]] + ","
else
call DisplayTimedTextToPlayer(Player(Offering[tID]), 0,0, DISPLAY_TIME, "Your Alliance offer to " + Faction[Recieving[tID]] + " has expired.")
call DisplayTimedTextToPlayer(Player(Recieving[tID]), 0,0, DISPLAY_TIME, Faction[Offering[tID]] + "'s Alliance offer has expired.\n")
//set msg_a[PenDexPlayer_1[i]] = msg_a[PenDexPlayer_1[i]] + " " + Faction[PenDexPlayer_2[i]] + ","
endif
endfunction
private function MakeOffer takes integer f, integer pID_1, integer pID_2 returns nothing
set Timer[f] = CreateTimer()
set PendingOffer[f] = true
call TimerStart(Timer[f], 5, false, function OfferExpires)
call SaveInteger(hash, GetHandleId(Timer[f]), 0, f)
set Offering[f] = pID_1
set Recieving[f] = pID_2
endfunction
//********************************//
// Triggers //
//********************************//
private function Reveal takes nothing returns boolean
local integer cmd_pID
local player p
local string s = ""
local string s1 = ""
local string s2 = ""
local string s3 = ""
local integer i = 0
call SetWords()
set cmd_pID = GetPlayerId(cmd_p)
if (cmd_p != null and IsPlayerInForce(cmd_p, Active) == true) then
set s = Faction[cmd_pID] + "\n"
loop
exitwhen i > 11
set p = Player(i)
if (IsPlayerInForce(p, Active)) then
if (IsPlayerAlly(cmd_p,p) == true and GetPlayerAlliance(p, cmd_p, ALLIANCE_SHARED_VISION) == true and cmd_p != p) then
set s1 = s1 + " " + Faction[i] + ","
elseif (IsPlayerAlly(cmd_p, p) == true and GetPlayerAlliance(cmd_p, p, ALLIANCE_SHARED_VISION) == false) then
set s2 = s2 + " " + Faction[i] + ","
elseif (IsPlayerEnemy(cmd_p, p)) then
set s3 = s3 + " " + Faction[i] + ","
endif
endif
set i = i + 1
endloop
if (StringLength(s1) > 0) then
set s1 = "Allied:" + DisplayFaction(s1) + ".\n"
endif
if (StringLength(s2) > 0) then
set s2 = "Neutral:" + DisplayFaction(s2) + ".\n"
endif
if (StringLength(s3) > 0) then
set s3 = "Hostile:" + DisplayFaction(s3) + "."
endif
call DisplayTimedTextToPlayer(GetTriggerPlayer(), 0, 0, DISPLAY_TIME, s+s1+s2+s3)
endif
return false
endfunction
private function War takes nothing returns boolean
local integer i = 13
local player p = GetTriggerPlayer()
local integer pID = GetPlayerId(p)
local player p_i
local integer cmd_pID
local string msg = ""
call SetWords()
if (cmd_p != null) then
set cmd_pID = GetPlayerId(cmd_p)
if (cmd_pID < 12) then
set i = cmd_pID
elseif (cmd_pID == 12) then
set i = 0
endif
loop
exitwhen i > 11
set p_i = Player(i)
if (IsPlayerAlly(p, p_i) == true and p != p_i) then
call SetPlayerAllianceStateBJ(p, p_i, bj_ALLIANCE_UNALLIED)
call SetPlayerAllianceStateBJ(p_i, p, bj_ALLIANCE_UNALLIED)
if (PendingOffer[(pID+1)*12+(i+1)-12] == true) then
call RemoveOffer((pID+1)*12+(i+1)-12)
endif
if (PendingOffer[(i+1)*12+(pID+1)-12] == true) then
call RemoveOffer((i+1)*12+(pID+1)-12)
endif
if (PendingOffer[144+(pID+1)*12+(i+1)-12] == true) then
call RemoveOffer(144+(pID+1)*12+(i+1)-12)
endif
if (PendingOffer[144+(i+1)*12+(pID+1)-12] == true) then
call RemoveOffer(144+(i+1)*12+(pID+1)-12)
endif
if (GetLocalPlayer() == p_i) then
call StopSound(s_War, false, false)
call StartSound(s_War)
endif
set msg = msg + " " + Faction[i] + ","
endif
if (cmd_pID != 12) then
set i = 12
else
set i = i + 1
endif
endloop
if (StringLength(msg) > 0) then
if (GetLocalPlayer() == p) then
call StopSound(s_War, false, false)
call StartSound(s_War)
endif
set msg = Faction[pID] + " declares War on" + DisplayFaction(msg) + "."
call DisplayTimedTextToPlayer(GetLocalPlayer(), 0,0, DISPLAY_TIME, msg)
endif
endif
return false
endfunction
private function Peace takes nothing returns boolean
local integer i = 13
local integer x
local player p1 = GetTriggerPlayer()
local player p_i
local integer pID_1 = GetPlayerId(p1)
local integer f1
local integer f2
local string msg1 = ""
local string msg2 = ""
call SetWords()
if (cmd_p != null) then
set x = GetPlayerId(cmd_p)
if (x < 12) then
set i = x
elseif (x == 12) then
set i = 0
endif
endif
loop
exitwhen i > 11
set f1 = (pID_1+1)*12+(i+1)-12
set f2 = (i+1)*12+(pID_1+1)-12
set p_i = Player(i)
// Accept Peace
if (PendingOffer[f2] == true) then
call RemoveOffer(f2)
call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, DISPLAY_TIME, Faction[i] + " and " + Faction[pID_1] + " are now neutral towards each other.")
call SetPlayerAllianceStateBJ( p_i, p1, bj_ALLIANCE_NEUTRAL)
call SetPlayerAllianceStateBJ( p1, p_i, bj_ALLIANCE_NEUTRAL)
// Offer Peace
elseif (IsPlayerEnemy(p1, p_i) == true and IsPlayerInForce(p_i, Active) == true and PendingOffer[f1] == false) then
call MakeOffer(f1, pID_1, i)
set msg1 = msg1 + " " + Faction[i] + ","
call DisplayTimedTextToPlayer(p_i, 0,0, DISPLAY_TIME, Faction[pID_1] + " has offered you Peace.")
if (GetLocalPlayer() == p_i) then
call StopSound(s_Peace, false, false)
call StartSound(s_Peace)
endif
// End Alliance into Neutral
elseif (x < 12 and IsPlayerAlly(p1, p_i) == true and GetPlayerAlliance(p1, p_i, ALLIANCE_SHARED_VISION) == true and p1 != p_i) then
call DisplayTimedTextToPlayer(GetLocalPlayer(), 0,0, DISPLAY_TIME, Faction[pID_1] + " has ended the alliance with " + Faction[i] + ".")
call SetPlayerAllianceStateBJ( p_i, p1, bj_ALLIANCE_NEUTRAL)
call SetPlayerAllianceStateBJ( p1, p_i, bj_ALLIANCE_NEUTRAL)
if (GetLocalPlayer() == p1 or GetLocalPlayer() == p_i) then
call StopSound(s_Peace, false, false)
call StartSound(s_Peace)
endif
// Withdraw Peace Offer
elseif (PendingOffer[f1] == true) then
call RemoveOffer(f1)
set msg2 = msg2 + " " + Faction[i] + ","
call DisplayTimedTextToPlayer(p_i, 0,0, DISPLAY_TIME, Faction[pID_1] + " has withdrawn the peace offer.")
endif
if (x < 12) then
set i = 12
else
set i = i + 1
endif
endloop
if (StringLength(msg1) > 0) then
set msg1 = "You offered" + DisplayFaction(msg1) + " Peace."
call DisplayTimedTextToPlayer(p1, 0,0, DISPLAY_TIME, msg1)
endif
if (StringLength(msg2) > 0) then
set msg2 = "You are no longer offering" + DisplayFaction(msg2) + " Peace."
call DisplayTimedTextToPlayer(p1, 0,0, DISPLAY_TIME, msg2)
endif
return false
endfunction
private function Ally takes nothing returns boolean
local player p = GetTriggerPlayer()
local integer pID = GetPlayerId(p)
local integer cmd_pID
local integer f1
local integer f2
call SetWords()
if (cmd_p != null and IsPlayerInForce(cmd_p, Active) == true and cmd_p != p) then
set cmd_pID = GetPlayerId(cmd_p)
set f1 = 144 + (pID+1)*12+(cmd_pID+1)-12
set f2 = 144 + (cmd_pID+1)*12+(pID+1)-12
// Accept Alliance
if (PendingOffer[f2] == true) then
if (AllyCount[pID] < AllyLimit and AllyCount[cmd_pID] < AllyLimit) then
set AllyCount[pID] = AllyCount[pID] + 1
set AllyCount[cmd_pID] = AllyCount[cmd_pID] + 1
call RemoveOffer(f2)
// Remove Pending Neutral Offers
if (PendingOffer[f1-144] == true) then
call RemoveOffer(f1-144)
endif
if (PendingOffer[f2-144] == true) then
call RemoveOffer(f2-144)
endif
call DisplayTimedTextToPlayer(GetLocalPlayer(), 0,0, DISPLAY_TIME, Faction[cmd_pID] + " and " + Faction[pID] + " have formed an Alliance!")
call SetPlayerAllianceStateBJ(cmd_p, p, bj_ALLIANCE_ALLIED_VISION)
call SetPlayerAllianceStateBJ(p, cmd_p, bj_ALLIANCE_ALLIED_VISION)
if (GetLocalPlayer() == cmd_p or GetLocalPlayer() == p) then
call StopSound(s_Ally, false, false)
call StartSound(s_Ally)
endif
else
if (AllyCount[pID] >= AllyLimit) then
call DisplayTimedTextToPlayer(p, 0,0, DISPLAY_TIME, "Can't Ally " + Faction[cmd_pID] + ". Ally Limit reached.")
else
call DisplayTimedTextToPlayer(p, 0,0, DISPLAY_TIME, "Can't Ally " + Faction[cmd_pID] + ". That faction has reached the Ally Limit. ")
endif
endif
// Offer Alliance
elseif (GetPlayerAlliance(cmd_p, p, ALLIANCE_SHARED_VISION) == false and PendingOffer[f1] == false) then
if (AllyCount[pID] < AllyLimit) then
call MakeOffer(f1, pID, cmd_pID)
call DisplayTimedTextToPlayer(cmd_p, 0,0, DISPLAY_TIME, Faction[pID] + " has offered you an Alliance.\n")
call DisplayTimedTextToPlayer(p, 0,0, DISPLAY_TIME, "You offered " + Faction[cmd_pID] + " an Alliance.\n")
if (GetLocalPlayer() == cmd_p) then
call StopSound(s_Offer, false, false)
call StartSound(s_Offer)
endif
else
call DisplayTimedTextToPlayer(p, 0,0, DISPLAY_TIME, "Can't Offer Alliance to " + Faction[cmd_pID] + ". Ally Limit reached.")
endif
// Withdraw Offer
elseif (PendingOffer[f1] == true) then
call RemoveOffer(f1)
call DisplayTimedTextToPlayer(p, 0,0, DISPLAY_TIME, Faction[pID] + " has withdrawn the Alliance offer.")
call DisplayTimedTextToPlayer(p, 0,0, DISPLAY_TIME, "You are no longer offering " + Faction[cmd_pID] + " an Alliance.")
endif
endif
return false
endfunction
private function Give takes nothing returns boolean
return false
endfunction
private function Help takes nothing returns boolean
local string msg = "Diplomacy Commands:\n-reveal # or -r # \n-ally # or -alliance # \n-war # or -unally # \n-neutral # or -na # or -peace #\n"
call DisplayTimedTextToPlayer(GetTriggerPlayer(), 0, 0, DISPLAY_TIME, msg)
return false
endfunction
private function Leaves takes nothing returns boolean
call ForceRemovePlayer(Active, GetTriggerPlayer())
return false
endfunction
//===========================================================================
private function init takes nothing returns nothing
local trigger array t
local integer i = 0
loop
exitwhen i > 5
set t[i] = CreateTrigger()
set i = i + 1
endloop
set i = 0
loop
exitwhen i > 11
if (GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING and GetPlayerController(Player(i)) == MAP_CONTROL_USER) then
call ForceAddPlayer(Active, Player(i))
call TriggerRegisterPlayerChatEvent(t[0], Player(i), "-reveal", false)
call TriggerRegisterPlayerChatEvent(t[0], Player(i), "-r", false)
call TriggerRegisterPlayerChatEvent(t[1], Player(i), "-war", false)
call TriggerRegisterPlayerChatEvent(t[1], Player(i), "-unally", false)
call TriggerRegisterPlayerChatEvent(t[2], Player(i), "-na", false)
call TriggerRegisterPlayerChatEvent(t[2], Player(i), "-neutral", false)
call TriggerRegisterPlayerChatEvent(t[2], Player(i), "-peace", false)
call TriggerRegisterPlayerChatEvent(t[3], Player(i), "-ally", false)
call TriggerRegisterPlayerChatEvent(t[3], Player(i), "-alliance", false)
call TriggerRegisterPlayerChatEvent(t[4], Player(i), "-diplomacy", false)
call TriggerRegisterPlayerChatEvent(t[4], Player(i), "-d", false)
call TriggerRegisterPlayerEventLeave(t[5], Player(i))
endif
set i = i + 1
endloop
call TriggerAddCondition( t[0], Condition( function Reveal ))
call TriggerAddCondition( t[1], Condition( function War ))
call TriggerAddCondition( t[2], Condition( function Peace ))
call TriggerAddCondition( t[3], Condition( function Ally ))
call TriggerAddCondition( t[4], Condition( function Help ))
call TriggerAddCondition( t[5], Condition( function Leaves ))
set i = 0
loop
exitwhen t[i] == null
set t[i] = null
set i = i + 1
endloop
set s_Offer = gg_snd_PEACE
set s_Peace = gg_snd_PEACE
set s_War = gg_snd_WAR
set s_Ally = gg_snd_ALLY
set Faction[0] = "|c00FF0303Sparta|r"
set Faction[1] = "|c000042FFAthens|r"
set Faction[2] = "|c001CE6B9Argos|r"
set Faction[3] = "|c00540081Thebes|r"
set Faction[4] = "|c00FFFC01Epirus|r"
set Faction[5] = "|c00fEBA0EMacedon|r"
set Faction[6] = "|c0020C000Thessaly|r"
set Faction[7] = "|c00E55BB0Crete|r"
set Faction[8] = "|c00959697Persia|r"
set Faction[9] = "|c007EBFF1Thrace|r"
set Faction[10] = "|c00106246Rhodes|r"
set Faction[11] = "|c004E2A04Troy|r"
// Player 0
call SaveInteger(hash,0, StringHash("red"),0)
call SaveInteger(hash,0, StringHash("sparta"),0)
call SaveInteger(hash,0, StringHash("1"),0)
// Player 1
call SaveInteger(hash,0, StringHash("blue"),1)
call SaveInteger(hash,0, StringHash("athens"),1)
call SaveInteger(hash,0, StringHash("2"),1)
// Player 2
call SaveInteger(hash,0, StringHash("teal"),2)
call SaveInteger(hash,0, StringHash("argos"),2)
call SaveInteger(hash,0, StringHash("3"),2)
// Player 3
call SaveInteger(hash,0, StringHash("purple"),3)
call SaveInteger(hash,0, StringHash("thebes"),3)
call SaveInteger(hash,0, StringHash("4"),3)
// Player 4
call SaveInteger(hash,0, StringHash("yellow"),4)
call SaveInteger(hash,0, StringHash("epirus"),4)
call SaveInteger(hash,0, StringHash("5"), 4)
// Player 5
call SaveInteger(hash,0, StringHash("orange"),5)
call SaveInteger(hash,0, StringHash("epirus"),5)
call SaveInteger(hash,0, StringHash("6"),5)
// Player 6
call SaveInteger(hash,0, StringHash("green"),6)
call SaveInteger(hash,0, StringHash("thessaly"),6)
call SaveInteger(hash,0, StringHash("7"), 6)
// Player 7
call SaveInteger(hash,0, StringHash("pink"),7)
call SaveInteger(hash,0, StringHash("crete"),7)
call SaveInteger(hash,0, StringHash("8"),7)
// Player 8
call SaveInteger(hash,0, StringHash("gray"),8)
call SaveInteger(hash,0, StringHash("grey"),8)
call SaveInteger(hash,0, StringHash("persia"),8)
call SaveInteger(hash,0, StringHash("9"),8)
// Player 9
call SaveInteger(hash,0, StringHash("light blue"),9)
call SaveInteger(hash,0, StringHash("lightblue"),9)
call SaveInteger(hash,0, StringHash("lb"),9)
call SaveInteger(hash,0, StringHash("thrace"),9)
call SaveInteger(hash,0, StringHash("10"),9)
// Player 10
call SaveInteger(hash,0, StringHash("dark green"),10)
call SaveInteger(hash,0, StringHash("darkgreen"),10)
call SaveInteger(hash,0, StringHash("dg"),10)
call SaveInteger(hash,0, StringHash("rhodes"),10)
call SaveInteger(hash,0, StringHash("11"),10)
// Player 11
call SaveInteger(hash,0, StringHash("brown"),11)
call SaveInteger(hash,0, StringHash("troy"),11)
call SaveInteger(hash,0, StringHash("12"),11)
// All Players
call SaveInteger(hash,0, StringHash("all"),12)
// Gold
call SaveInteger(hash,0, StringHash("gold"),14)
call SaveInteger(hash,0, StringHash("g"),14)
// Lumber
call SaveInteger(hash,0, StringHash("lumber"),15)
call SaveInteger(hash,0, StringHash("l"),15)
call SaveInteger(hash,0, StringHash("wood"),15)
call SaveInteger(hash,0, StringHash("w"),15)
endfunction
endlibrary
Attached the map below.
Attachments
Last edited: