Adds Byond medal and scoreboard support and tracking for megafauna kills.

This commit is contained in:
Shadowlight213
2016-07-18 17:02:49 -07:00
parent 789e908416
commit e79cebbbef
12 changed files with 193 additions and 2 deletions
+17
View File
@@ -481,3 +481,20 @@ var/global/list/ghost_others_options = list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
// 1: stuff in mob, 2: stuff in backpack, 3: stuff in box in backpack, etc
#define INVENTORY_DEPTH 3
#define STORAGE_VIEW_DEPTH 2
// Medal names
#define BOSS_KILL_MEDAL "Killer"
#define ALL_KILL_MEDAL "Exterminator" //Killing all of x type
// Score names
#define LEGION_SCORE "Legion Killed"
#define COLOSSUS_SCORE "Colossus Killed"
#define BUBBLEGUM_SCORE "Bubblegum Killed"
#define DRAKE_SCORE "Drakes Killed"
#define BOSS_SCORE "Bosses Killed"
#define TENDRIL_CLEAR_SCORE "Tendrils Killed"
+5
View File
@@ -30,6 +30,11 @@ var/global/comms_allowed = 0 //By default, the server does not allow messages to
var/global/cross_address = "byond://" //This needs to be global as the message sent contains the comms key.
var/global/cross_allowed = 0 //Don't bother attempting to send if the address wasn't set.
var/global/medal_hub = null
var/global/medal_pass = " "
var/global/medals_enabled = TRUE //will be auto set to false if the game fails contacting the medal hub to prevent unneeded calls.
//This was a define, but I changed it to a variable so it can be changed in-game.(kept the all-caps definition because... code...) -Errorage
var/MAX_EX_DEVESTATION_RANGE = 3
var/MAX_EX_HEAVY_RANGE = 7
+4
View File
@@ -376,6 +376,10 @@
global.cross_allowed = 1
if("cross_comms_name")
cross_name = value
if("medal_hub_address")
global.medal_hub = value
if("medal_hub_password")
global.medal_pass = value
if("see_own_notes")
config.see_own_notes = 1
if("soft_popcap")
+2 -1
View File
@@ -149,7 +149,8 @@ var/list/admin_verbs_debug = list(
/client/proc/map_template_load,
/client/proc/map_template_upload,
/client/proc/jump_to_ruin,
/client/proc/clear_dynamic_transit
/client/proc/clear_dynamic_transit,
/client/proc/toggle_medal_disable
)
var/list/admin_verbs_possess = list(
/proc/possess,
+14
View File
@@ -777,3 +777,17 @@ var/global/list/g_fancy_list_of_types = null
message_admins("<span class='adminnotice'>[key_name_admin(src)] cleared dynamic transit space.</span>")
feedback_add_details("admin_verb","CDT") // If...
log_admin("[key_name(src)] cleared dynamic transit space.")
/client/proc/toggle_medal_disable()
set category = "Debug"
set name = "Toggle Medal Disable"
set desc = "Toggles the safety lock on trying to contact the medal hub."
if(!holder)
return
global.medals_enabled = !global.medals_enabled
message_admins("<span class='adminnotice'>[key_name_admin(src)] [global.medals_enabled ? "enabled" : "disabled"] the medal hub lockout.</span>")
feedback_add_details("admin_verb","TMH") // If...
log_admin("[key_name(src)] [global.medals_enabled ? "enabled" : "disabled"] the medal hub lockout.")
@@ -50,6 +50,8 @@ Difficulty: Hard
idle_vision_range = 5
loot = list(/obj/structure/closet/crate/necropolis/bubblegum)
var/charging = 0
medal_type = "Bubblegum"
score_type = BUBBLEGUM_SCORE
deathmessage = "sinks into a pool of blood, fleeing the battle. You've won, for now... "
death_sound = 'sound/magic/enter_blood.ogg'
@@ -49,6 +49,8 @@ Difficulty: Very Hard
aggro_vision_range = 18
idle_vision_range = 5
del_on_death = 1
medal_type = "Colossus"
score_type = COLOSSUS_SCORE
loot = list(/obj/machinery/smartfridge/black_box)
butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30)
@@ -56,6 +56,8 @@ Difficulty: Medium
var/obj/item/device/gps/internal
var/swooping = 0
var/swoop_cooldown = 0
medal_type = "Drake"
score_type = DRAKE_SCORE
deathmessage = "collapses into a pile of bones, its flesh sloughing away."
death_sound = 'sound/magic/demon_dies.ogg'
damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
@@ -40,10 +40,13 @@ Difficulty: Medium
ranged_cooldown_time = 20
var/size = 10
var/charging = 0
medal_type = "Legion"
score_type = LEGION_SCORE
pixel_y = -90
pixel_x = -75
loot = list(/obj/item/stack/sheet/bone = 3)
vision_range = 13
elimination = 1
aggro_vision_range = 18
idle_vision_range = 13
@@ -108,6 +111,7 @@ Difficulty: Medium
break
if(last_legion)
src.loot = list(/obj/item/weapon/staff/storm)
elimination = 0
else if(prob(5))
src.loot = list(/obj/structure/closet/crate/necropolis/tendril)
..()
@@ -12,6 +12,9 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = INFINITY
var/medal_type = "Boss"
var/score_type = BOSS_SCORE
var/elimination = 0
anchored = TRUE
layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise
@@ -20,6 +23,8 @@
return
else
feedback_set_details("megafauna_kills","[initial(name)]")
if(!elimination) //used so the achievment only occurs for the last legion to die.
grant_achievement(medal_type,score_type)
..()
/mob/living/simple_animal/hostile/megafauna/gib()
@@ -62,4 +67,116 @@
adjustBruteLoss(100)
if(3)
adjustBruteLoss(50)
adjustBruteLoss(50)
/mob/living/simple_animal/hostile/megafauna/proc/grant_achievement(medaltype,scoretype)
if(medal_type == "Boss") //Don't award medals if the medal type isn't set
return
for(var/mob/living/L in view(7,src))
if(L.stat)
continue
if(L.client)
var/client/C = L.client
var/suffixm = BOSS_KILL_MEDAL
UnlockMedal("Boss [suffixm]",C)
UnlockMedal("[medaltype] [suffixm]",C)
SetScore(BOSS_SCORE,C,1)
SetScore(score_type,C,1)
/proc/UnlockMedal(medal,client/player)
if(!player || !medal)
return
if(global.medal_hub && global.medal_pass && global.medals_enabled)
spawn()
var/result = world.SetMedal(medal, player, global.medal_hub, global.medal_pass)
if(isnull(result))
global.medals_enabled = FALSE
log_game("MEDAL ERROR: Could not contact hub to award medal:[medal] player:[player.ckey]")
message_admins("Error! Failed to contact hub to award [medal] medal to [player.ckey]!")
else if (result)
player << "<font color='green'><B>Achievement unlocked: [medal]!</B></font>"
/proc/SetScore(score,client/player,increment,force)
if(!score || !player)
return
if(global.medal_hub && global.medal_pass && global.medals_enabled)
spawn()
var/list/oldscore = GetScore(score,player,1)
if(increment)
if(!oldscore[score])
oldscore[score] = 1
else
oldscore[score] = (text2num(oldscore[score]) + 1)
else
oldscore[score] = force
var/newscoreparam = list2params(oldscore)
var/result = world.SetScores(player.ckey, newscoreparam, global.medal_hub, global.medal_pass)
if(isnull(result))
global.medals_enabled = FALSE
log_game("SCORE ERROR: Could not contact hub to set score. Score:[score] player:[player.ckey]")
message_admins("Error! Failed to contact hub to set [score] score for [player.ckey]!")
/proc/GetScore(score,client/player,returnlist)
if(!score || !player)
return
if(global.medal_hub && global.medal_pass && global.medals_enabled)
var/scoreget = world.GetScores(player.ckey, score, global.medal_hub, global.medal_pass)
if(isnull(scoreget))
global.medals_enabled = FALSE
log_game("SCORE ERROR: Could not contact hub to get score. Score:[score] player:[player.ckey]")
message_admins("Error! Failed to contact hub to get score: [score] for [player.ckey]!")
return
var/list/scoregetlist = params2list(scoreget)
if(returnlist)
return scoregetlist
else
return scoregetlist[score]
/proc/CheckMedal(medal,client/player)
if(!player || !medal)
return
if(global.medal_hub && global.medal_pass && global.medals_enabled)
var/result = world.GetMedal(medal, player, global.medal_hub, global.medal_pass)
if(isnull(result))
global.medals_enabled = FALSE
log_game("MEDAL ERROR: Could not contact hub to get medal:[medal] player:[player.ckey]")
message_admins("Error! Failed to contact hub to get [medal] medal for [player.ckey]!")
else if (result)
player << "[medal] is unlocked"
/proc/LockMedal(medal,client/player)
if(!player || !medal)
return
if(global.medal_hub && global.medal_pass && global.medals_enabled)
var/result = world.ClearMedal(medal, player, global.medal_hub, global.medal_pass)
if(isnull(result))
global.medals_enabled = FALSE
log_game("MEDAL ERROR: Could not contact hub to clear medal:[medal] player:[player.ckey]")
message_admins("Error! Failed to contact hub to clear [medal] medal for [player.ckey]!")
else if (result)
message_admins("Medal: [medal] removed for [player.ckey]")
else
message_admins("Medal: [medal] was not found for [player.ckey]. Unable to clear.")
@@ -1011,6 +1011,23 @@
qdel(gps)
. = ..()
/mob/living/simple_animal/hostile/spawner/lavaland/death()
var/last_tendril = TRUE
for(var/mob/living/simple_animal/hostile/spawner/lavaland/other in mob_list)
if(other != src)
last_tendril = FALSE
break
if(last_tendril)
for(var/mob/living/L in view(7,src))
if(L.stat)
continue
if(L.client)
var/client/C = L.client
var/suffixm = ALL_KILL_MEDAL
UnlockMedal("Tendril [suffixm]",C)
SetScore(TENDRIL_CLEAR_SCORE,C,1)
/obj/effect/collapse
name = "collapsing necropolis tendril"
desc = "Get clear!"
+6
View File
@@ -187,6 +187,12 @@ TICKLAG 0.5
## Name that the server calls itself in communications
#CROSS_COMMS_NAME
## Hub address for tracking stats
MEDAL_HUB_ADDRESS
## Password for the hub page
MEDAL_HUB_PASSWORD
## Uncomment this to let players see their own notes (they can still be set by admins only)
#SEE_OWN_NOTES