mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-22 05:25:15 +01:00
Fixing merge conflicts
This commit is contained in:
@@ -1,13 +1,32 @@
|
||||
/client/proc/admin_memo(task in list("Show","Write","Edit","Remove"))
|
||||
/client/proc/admin_memo()
|
||||
set name = "Memo"
|
||||
set category = "Server"
|
||||
if(!check_rights(0)) return
|
||||
if(!dbcon.IsConnected())
|
||||
usr << "<span class='danger'>Failed to establish database connection.</span>"
|
||||
src << "<span class='danger'>Failed to establish database connection.</span>"
|
||||
return
|
||||
var/memotask = input(usr,"Choose task.","Memo") in list("Show","Write","Edit","Remove")
|
||||
if(!memotask)
|
||||
return
|
||||
admin_memo_output(memotask)
|
||||
|
||||
/client/proc/admin_memo_output(task)
|
||||
if(!task)
|
||||
return
|
||||
if(!dbcon.IsConnected())
|
||||
src << "<span class='danger'>Failed to establish database connection.</span>"
|
||||
return
|
||||
var/sql_ckey = sanitizeSQL(src.ckey)
|
||||
switch(task)
|
||||
if("Write")
|
||||
var/DBQuery/query_memocheck = dbcon.NewQuery("SELECT ckey FROM [format_table_name("memo")] WHERE (ckey = '[sql_ckey]')")
|
||||
if(!query_memocheck.Execute())
|
||||
var/err = query_memocheck.ErrorMsg()
|
||||
log_game("SQL ERROR obtaining ckey from memo table. Error : \[[err]\]\n")
|
||||
return
|
||||
if(query_memocheck.NextRow())
|
||||
src << "You already have set a memo."
|
||||
return
|
||||
var/memotext = input(src,"Write your Memo","Memo") as text|null
|
||||
if(!memotext)
|
||||
return
|
||||
@@ -26,13 +45,13 @@
|
||||
var/err = query_memolist.ErrorMsg()
|
||||
log_game("SQL ERROR obtaining ckey from memo table. Error : \[[err]\]\n")
|
||||
return
|
||||
if(!query_memolist.NextRow())
|
||||
src << "No memos found in database."
|
||||
return
|
||||
var/list/memolist = list()
|
||||
while(query_memolist.NextRow())
|
||||
var/ckey = query_memolist.item[2]
|
||||
memolist += "[ckey]"
|
||||
var/lkey = query_memolist.item[1]
|
||||
memolist += "[lkey]"
|
||||
if(!memolist.len)
|
||||
src << "No memos found in database."
|
||||
return
|
||||
var/target_ckey = input(src, "Select whose memo to edit", "Select memo") as null|anything in memolist
|
||||
if(!target_ckey)
|
||||
return
|
||||
@@ -43,14 +62,14 @@
|
||||
log_game("SQL ERROR obtaining ckey, memotext from memo table. Error : \[[err]\]\n")
|
||||
return
|
||||
if(query_memofind.NextRow())
|
||||
var/old_memo = query_memofind.item[3]
|
||||
var/old_memo = query_memofind.item[2]
|
||||
var/new_memo = input("Input new memo", "New Memo", "[old_memo]", null) as null|text
|
||||
if(!new_memo)
|
||||
return
|
||||
new_memo = sanitizeSQL(new_memo)
|
||||
var/edit_text = "Edited by [sql_ckey] on [SQLtime()] from<br>[old_memo]<br>to<br>[new_memo]<hr>"
|
||||
edit_text = sanitizeSQL(edit_text)
|
||||
var/DBQuery/update_query = dbcon.NewQuery("UPDATE [format_table_name("memo")] SET memotext = '[new_memo]', last_editor = '[sql_ckey]', edits = CONCAT(edits,'[edit_text]') WHERE (ckey = '[target_sql_ckey]')")
|
||||
var/DBQuery/update_query = dbcon.NewQuery("UPDATE [format_table_name("memo")] SET memotext = '[new_memo]', last_editor = '[sql_ckey]', edits = CONCAT(IFNULL(edits,''),'[edit_text]') WHERE (ckey = '[target_sql_ckey]')")
|
||||
if(!update_query.Execute())
|
||||
var/err = update_query.ErrorMsg()
|
||||
log_game("SQL ERROR editing memo. Error : \[[err]\]\n")
|
||||
@@ -62,18 +81,24 @@
|
||||
log_admin("[key_name(src)] has edited [target_sql_ckey]'s memo from [old_memo] to [new_memo]")
|
||||
message_admins("[key_name_admin(src)] has edited [target_sql_ckey]'s memo from<br>[old_memo]<br>to<br>[new_memo]")
|
||||
if("Show")
|
||||
var/DBQuery/query_memoshow = dbcon.NewQuery("SELECT id, ckey, memotext, timestamp, last_editor FROM [format_table_name("memo")])")
|
||||
var/output
|
||||
var/DBQuery/query_memoshow = dbcon.NewQuery("SELECT ckey, memotext, timestamp, last_editor FROM [format_table_name("memo")]")
|
||||
if(!query_memoshow.Execute())
|
||||
var/err = query_memoshow.ErrorMsg()
|
||||
log_game("SQL ERROR obtaining ckey, memotext, timestamp, last_editor from memo table. Error : \[[err]\]\n")
|
||||
return
|
||||
var/output = null
|
||||
while(query_memoshow.NextRow())
|
||||
var/id = query_memoshow.item[1]
|
||||
var/ckey = query_memoshow.item[2]
|
||||
var/memotext = query_memoshow.item[3]
|
||||
var/timestamp = query_memoshow.item[4]
|
||||
var/last_editor = query_memoshow.item[5]
|
||||
output += "<span class='memo'>Memo by <span class='prefix'>[ckey]</span> on [timestamp]:"
|
||||
var/ckey = query_memoshow.item[1]
|
||||
var/memotext = query_memoshow.item[2]
|
||||
var/timestamp = query_memoshow.item[3]
|
||||
var/last_editor = query_memoshow.item[4]
|
||||
output += "<span class='memo'>Memo by <span class='prefix'>[ckey]</span> on [timestamp]"
|
||||
if(last_editor)
|
||||
output += "<br><span class='memoedit'>Last edit by [last_editor] <A href='?_src_=holder;memoeditlist=[id]'>(Click here to see edit log)</A></span>"
|
||||
output += "<br><span class='memoedit'>Last edit by [last_editor] <A href='?_src_=holder;memoeditlist=[ckey]'>(Click here to see edit log)</A></span>"
|
||||
output += "<br>[memotext]</span><br>"
|
||||
if(!output)
|
||||
src << "No memos found in database."
|
||||
return
|
||||
src << output
|
||||
if("Remove")
|
||||
var/DBQuery/query_memodellist = dbcon.NewQuery("SELECT ckey FROM [format_table_name("memo")]")
|
||||
@@ -81,13 +106,13 @@
|
||||
var/err = query_memodellist.ErrorMsg()
|
||||
log_game("SQL ERROR obtaining ckey from memo table. Error : \[[err]\]\n")
|
||||
return
|
||||
if(!query_memodellist.NextRow())
|
||||
src << "No memos found in database."
|
||||
return
|
||||
var/list/memolist = list()
|
||||
while(query_memodellist.NextRow())
|
||||
var/ckey = query_memodellist.item[2]
|
||||
var/ckey = query_memodellist.item[1]
|
||||
memolist += "[ckey]"
|
||||
if(!memolist.len)
|
||||
src << "No memos found in database."
|
||||
return
|
||||
var/target_ckey = input(src, "Select whose memo to delete", "Select memo") as null|anything in memolist
|
||||
if(!target_ckey)
|
||||
return
|
||||
|
||||
@@ -264,7 +264,11 @@
|
||||
M_job = "New player"
|
||||
|
||||
else if(isobserver(M))
|
||||
M_job = "Ghost"
|
||||
var/mob/dead/observer/O = M
|
||||
if(O.started_as_observer)//Did they get BTFO or are they just not trying?
|
||||
M_job = "Observer"
|
||||
else
|
||||
M_job = "Ghost"
|
||||
|
||||
var/M_name = html_encode(M.name)
|
||||
var/M_rname = html_encode(M.real_name)
|
||||
|
||||
@@ -2058,10 +2058,14 @@
|
||||
src.access_news_network()
|
||||
|
||||
else if(href_list["memoeditlist"])
|
||||
var/DBQuery/query_memoedits = dbcon.NewQuery("SELECT edits FROM [format_table_name("memo")] WHERE (id = '[href_list["id"]]")
|
||||
query_memoedits.Execute()
|
||||
var/sql_key = sanitizeSQL("[href_list["memoeditlist"]]")
|
||||
var/DBQuery/query_memoedits = dbcon.NewQuery("SELECT edits FROM [format_table_name("memo")] WHERE (ckey = '[sql_key]')")
|
||||
if(!query_memoedits.Execute())
|
||||
var/err = query_memoedits.ErrorMsg()
|
||||
log_game("SQL ERROR obtaining edits from memo table. Error : \[[err]\]\n")
|
||||
return
|
||||
if(query_memoedits.NextRow())
|
||||
var/edit_log = query_memoedits.item[6]
|
||||
var/edit_log = query_memoedits.item[1]
|
||||
usr << browse(edit_log,"window=memoeditlist")
|
||||
|
||||
else if(href_list["check_antagonist"])
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
var/override
|
||||
switch(parameter)
|
||||
if(1)
|
||||
override = input(src,"mode = ?","Enter Parameter",null) as anything in list("nuclear emergency","no override")
|
||||
override = input(src,"mode = ?","Enter Parameter",null) as anything in list("nuclear emergency","gang war","fake","no override")
|
||||
if(0)
|
||||
override = input(src,"mode = ?","Enter Parameter",null) as anything in list("blob","nuclear emergency","AI malfunction","no override")
|
||||
ticker.station_explosion_cinematic(parameter,override)
|
||||
|
||||
@@ -40,7 +40,12 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
switch(alert("Proc owned by something?",,"Yes","No"))
|
||||
if("Yes")
|
||||
targetselected = 1
|
||||
class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client")
|
||||
if(src.holder && src.holder.marked_datum)
|
||||
class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client","Marked datum ([holder.marked_datum.type])")
|
||||
if(class == "Marked datum ([holder.marked_datum.type])")
|
||||
class = "Marked datum"
|
||||
else
|
||||
class = input("Proc owned by...","Owner",null) as null|anything in list("Obj","Mob","Area or Turf","Client")
|
||||
switch(class)
|
||||
if("Obj")
|
||||
target = input("Enter target:","Target",usr) as obj in world
|
||||
@@ -53,6 +58,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
for(var/client/C)
|
||||
keys += C
|
||||
target = input("Please, select a player!", "Selection", null, null) as null|anything in keys
|
||||
if("Marked datum")
|
||||
target = holder.marked_datum
|
||||
else
|
||||
return
|
||||
if("No")
|
||||
@@ -61,7 +68,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
|
||||
var/procname = input("Proc path, eg: /proc/fake_blood","Path:", null) as text|null
|
||||
if(!procname) return
|
||||
|
||||
if(targetselected && !hascall(target,procname))
|
||||
usr << "<font color='red'>Error: callproc(): target has no such call [procname].</font>"
|
||||
return
|
||||
var/list/lst = get_callproc_args()
|
||||
if(!lst)
|
||||
return
|
||||
@@ -70,9 +79,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
if(!target)
|
||||
usr << "<font color='red'>Error: callproc(): owner of proc no longer exists.</font>"
|
||||
return
|
||||
if(!hascall(target,procname))
|
||||
usr << "<font color='red'>Error: callproc(): target has no such call [procname].</font>"
|
||||
return
|
||||
log_admin("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
|
||||
returnval = call(target,procname)(arglist(lst)) // Pass the lst as an argument list to the proc
|
||||
else
|
||||
@@ -93,7 +99,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
var/procname = input("Proc name, eg: fake_blood","Proc:", null) as text|null
|
||||
if(!procname)
|
||||
return
|
||||
|
||||
if(!hascall(A,procname))
|
||||
usr << "<span class='warning'>Error: callproc_datum(): target has no such call [procname].</span>"
|
||||
return
|
||||
var/list/lst = get_callproc_args()
|
||||
if(!lst)
|
||||
return
|
||||
@@ -101,9 +109,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
if(!A || !IsValidSrc(A))
|
||||
usr << "<span class='warning'>Error: callproc_datum(): owner of proc no longer exists.</span>"
|
||||
return
|
||||
if(!hascall(A,procname))
|
||||
usr << "<span class='warning'>Error: callproc_datum(): target has no such call [procname].</span>"
|
||||
return
|
||||
log_admin("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
|
||||
|
||||
spawn()
|
||||
@@ -115,15 +120,21 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
/client/proc/get_callproc_args()
|
||||
var/argnum = input("Number of arguments","Number:",0) as num|null
|
||||
if(!argnum && (argnum!=0)) return
|
||||
|
||||
|
||||
var/list/lst = list()
|
||||
//TODO: make a list to store whether each argument was initialised as null.
|
||||
//Reason: So we can abort the proccall if say, one of our arguments was a mob which no longer exists
|
||||
//this will protect us from a fair few errors ~Carn
|
||||
|
||||
while(argnum--)
|
||||
var/class = null
|
||||
// Make a list with each index containing one variable, to be given to the proc
|
||||
var/class = input("What kind of variable?","Variable Type") in list("text","num","type","reference","mob reference","icon","file","client","mob's area","CANCEL")
|
||||
if(src.holder && src.holder.marked_datum)
|
||||
class = input("What kind of variable?","Variable Type") in list("text","num","type","reference","mob reference","icon","file","client","mob's area","Marked datum ([holder.marked_datum.type])","CANCEL")
|
||||
if(holder.marked_datum && class == "Marked datum ([holder.marked_datum.type])")
|
||||
class = "Marked datum"
|
||||
else
|
||||
class = input("What kind of variable?","Variable Type") in list("text","num","type","reference","mob reference","icon","file","client","mob's area","CANCEL")
|
||||
switch(class)
|
||||
if("CANCEL")
|
||||
return null
|
||||
@@ -158,6 +169,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
if("mob's area")
|
||||
var/mob/temp = input("Select mob", "Selection", usr) as mob in world
|
||||
lst += temp.loc
|
||||
if("Marked datum")
|
||||
lst += holder.marked_datum
|
||||
return lst
|
||||
|
||||
|
||||
@@ -400,6 +413,7 @@ var/list/TYPES_SHORTCUTS = list(
|
||||
/obj/machinery/portable_atmospherics = "PORT_ATMOS",
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/missile_rack = "MECHA_MISSILE_RACK",
|
||||
/obj/item/mecha_parts/mecha_equipment = "MECHA_EQUIP",
|
||||
/obj/item/organ/internal = "ORGAN_INT",
|
||||
)
|
||||
|
||||
var/global/list/g_fancy_list_of_types = null
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
/client/proc/manipulate_organs(mob/living/carbon/C in world)
|
||||
set name = "Manipulate Organs"
|
||||
set category = "Debug"
|
||||
var/operation = input("Select organ operation.", "Organ Manipulation", "cancel") in list("add organ", "add implant", "drop organ/implant", "remove organ/implant", "cancel")
|
||||
|
||||
var/list/organs = list()
|
||||
switch(operation)
|
||||
if("add organ")
|
||||
for(var/path in typesof(/obj/item/organ/internal) - /obj/item/organ/internal)
|
||||
var/dat = replacetext("[path]", "/obj/item/organ/internal/", ":")
|
||||
organs[dat] = path
|
||||
|
||||
var/obj/item/organ/internal/organ = input("Select organ type:", "Organ Manipulation", null) in organs
|
||||
organ = organs[organ]
|
||||
organ = new organ
|
||||
organ.Insert(C)
|
||||
|
||||
if("add implant")
|
||||
for(var/path in typesof(/obj/item/weapon/implant) - /obj/item/weapon/implant)
|
||||
var/dat = replacetext("[path]", "/obj/item/weapon/implant/", ":")
|
||||
organs[dat] = path
|
||||
|
||||
var/obj/item/weapon/implant/organ = input("Select implant type:", "Organ Manipulation", null) in organs
|
||||
organ = organs[organ]
|
||||
organ = new organ
|
||||
organ.implant(C)
|
||||
|
||||
if("drop organ/implant", "remove organ/implant")
|
||||
for(var/obj/item/organ/internal/I in C.internal_organs)
|
||||
organs["[I.name] ([I.type])"] = I
|
||||
|
||||
for(var/obj/item/weapon/implant/I in C)
|
||||
organs["[I.name] ([I.type])"] = I
|
||||
|
||||
var/obj/item/organ = input("Select organ/implant:", "Organ Manipulation", null) in organs
|
||||
organ = organs[organ]
|
||||
if(!organ) return
|
||||
var/obj/item/organ/internal/O
|
||||
var/obj/item/weapon/implant/I
|
||||
|
||||
if(isorgan(organ))
|
||||
O = organ
|
||||
O.Remove(C)
|
||||
else
|
||||
I = organ
|
||||
I.removed(C)
|
||||
|
||||
organ.loc = get_turf(C)
|
||||
|
||||
if(operation == "remove organ/implant")
|
||||
qdel(organ)
|
||||
else if(I) // Put the implant in case.
|
||||
var/obj/item/weapon/implantcase/case = new(get_turf(C))
|
||||
case.imp = I
|
||||
I.loc = case
|
||||
case.update_icon()
|
||||
@@ -159,6 +159,8 @@ var/intercom_range_display_status = 0
|
||||
src.verbs += /client/proc/print_pointers
|
||||
src.verbs += /client/proc/count_movable_instances
|
||||
src.verbs += /client/proc/cmd_show_at_list
|
||||
src.verbs += /client/proc/cmd_show_at_list
|
||||
src.verbs += /client/proc/manipulate_organs
|
||||
//src.verbs += /client/proc/cmd_admin_rejuvenate
|
||||
|
||||
feedback_add_details("admin_verb","mDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -450,17 +450,17 @@
|
||||
|
||||
// CENTCOM RESPONSE TEAM
|
||||
/datum/admins/proc/makeEmergencyresponseteam()
|
||||
var/alert = input("Which team should we send?", "Select Response Level") as null|anything in list("Green: Centcom Official", "Blue: Light ERT", "Amber: Full ERT", "Red: Elite ERT", "Delta: Deathsquad")
|
||||
var/alert = input("Which team should we send?", "Select Response Level") as null|anything in list("Green: Centcom Official", "Blue: Light ERT (No Armoury Access)", "Amber: Full ERT (Armoury Access)", "Red: Elite ERT (Armoury Access + Pulse Weapons)", "Delta: Deathsquad")
|
||||
if(!alert)
|
||||
return
|
||||
switch(alert)
|
||||
if("Delta: Deathsquad")
|
||||
return makeDeathsquad()
|
||||
if("Red: Elite ERT")
|
||||
if("Red: Elite ERT (Armoury Access + Pulse Weapons)")
|
||||
alert = "Red"
|
||||
if("Amber: Full ERT")
|
||||
if("Amber: Full ERT (Armoury Access)")
|
||||
alert = "Amber"
|
||||
if("Blue: Light ERT")
|
||||
if("Blue: Light ERT (No Armoury Access)")
|
||||
alert = "Blue"
|
||||
if("Green: Centcom Official")
|
||||
return makeOfficial()
|
||||
|
||||
@@ -1,18 +1,10 @@
|
||||
//Exile implants will allow you to use the station gate, but not return home.
|
||||
//This will allow security to exile badguys/for badguys to exile their kill targets
|
||||
|
||||
/obj/item/weapon/implanter/exile
|
||||
name = "implanter-exile"
|
||||
|
||||
/obj/item/weapon/implanter/exile/New()
|
||||
imp = new /obj/item/weapon/implant/exile( src )
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/weapon/implant/exile
|
||||
name = "exile implant"
|
||||
desc = "Prevents you from returning from away missions"
|
||||
origin_tech = "materials=2;biotech=3;magnets=2;bluespace=3"
|
||||
activated = 0
|
||||
|
||||
/obj/item/weapon/implant/exile/get_data()
|
||||
@@ -22,11 +14,16 @@
|
||||
return dat
|
||||
|
||||
|
||||
/obj/item/weapon/implanter/exile
|
||||
name = "implanter (exile)"
|
||||
|
||||
/obj/item/weapon/implanter/exile/New()
|
||||
imp = new /obj/item/weapon/implant/exile( src )
|
||||
..()
|
||||
|
||||
/obj/item/weapon/implantcase/exile
|
||||
name = "glass case- 'Exile'"
|
||||
desc = "A case containing an exile implant."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "implantcase-r"
|
||||
name = "implant case - 'Exile'"
|
||||
desc = "A glass case containing an exile implant."
|
||||
|
||||
/obj/item/weapon/implantcase/exile/New()
|
||||
imp = new /obj/item/weapon/implant/exile(src)
|
||||
|
||||
@@ -128,7 +128,7 @@ var/next_external_rsc = 0
|
||||
|
||||
if(holder)
|
||||
add_admin_verbs()
|
||||
admin_memo("Show")
|
||||
admin_memo_output("Show")
|
||||
if((global.comms_key == "default_pwd" || length(global.comms_key) <= 6) && global.comms_allowed) //It's the default value or less than 6 characters long, but it somehow didn't disable comms.
|
||||
src << "<span class='danger'>The server's API key is either too short or is the default value! Consider changing it immediately!</span>"
|
||||
|
||||
|
||||
@@ -1045,14 +1045,6 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
|
||||
character.real_name = real_name
|
||||
character.name = character.real_name
|
||||
|
||||
if(character.dna)
|
||||
character.dna.real_name = character.real_name
|
||||
if(pref_species != /datum/species/human && config.mutant_races)
|
||||
hardset_dna(character, null, null, null, null, pref_species.type, features)
|
||||
else
|
||||
hardset_dna(character, null, null, null, null, /datum/species/human, features)
|
||||
character.update_mutcolor()
|
||||
|
||||
character.gender = gender
|
||||
character.age = age
|
||||
character.blood_type = blood_type
|
||||
@@ -1072,5 +1064,15 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
|
||||
|
||||
character.backbag = backbag
|
||||
|
||||
character.update_body()
|
||||
character.update_hair()
|
||||
if(character.dna)
|
||||
var/datum/species/chosen_species
|
||||
|
||||
character.dna.real_name = character.real_name
|
||||
if(pref_species != /datum/species/human && config.mutant_races)
|
||||
chosen_species = pref_species.type
|
||||
else
|
||||
chosen_species = /datum/species/human
|
||||
hardset_dna(character, null, null, null, null, chosen_species, features)
|
||||
else
|
||||
character.update_body()
|
||||
character.update_hair()
|
||||
@@ -66,6 +66,13 @@
|
||||
item_state = "redgloves"
|
||||
item_color = "red"
|
||||
|
||||
/obj/item/clothing/gloves/color/red/insulated
|
||||
name = "insulated gloves"
|
||||
desc = "These gloves will protect the wearer from electric shock."
|
||||
siemens_coefficient = 0
|
||||
permeability_coefficient = 0.05
|
||||
burn_state = -1 //Won't burn in fires
|
||||
|
||||
/obj/item/clothing/gloves/color/rainbow
|
||||
name = "rainbow gloves"
|
||||
desc = "A pair of gloves, they don't look special in any way."
|
||||
|
||||
@@ -228,3 +228,8 @@
|
||||
name = "jester hat"
|
||||
desc = "A hat with bells, to add some merryness to the suit."
|
||||
icon_state = "jester_hat"
|
||||
|
||||
/obj/item/clothing/head/rice_hat
|
||||
name = "rice hat"
|
||||
desc = "Welcome to the rice fields, motherfucker."
|
||||
icon_state = "rice_hat"
|
||||
@@ -3,9 +3,9 @@
|
||||
/obj/item/clothing/under/rank/bartender
|
||||
desc = "It looks like it could use some more flair."
|
||||
name = "bartender's uniform"
|
||||
icon_state = "bar_suit"
|
||||
icon_state = "barman"
|
||||
item_state = "bar_suit"
|
||||
item_color = "bar_suit"
|
||||
item_color = "barman"
|
||||
|
||||
|
||||
/obj/item/clothing/under/rank/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define.
|
||||
|
||||
@@ -14,5 +14,5 @@
|
||||
continue
|
||||
|
||||
var/datum/disease/D = new /datum/disease/appendicitis
|
||||
H.AddDisease(D)
|
||||
H.ForceContractDisease(D)
|
||||
break
|
||||
@@ -15,7 +15,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
|
||||
var/image/halimage
|
||||
var/image/halbody
|
||||
var/obj/halitem
|
||||
var/hal_screwyhud = 0 //1 - critical, 2 - dead, 3 - oxygen indicator, 4 - toxin indicator
|
||||
var/hal_screwyhud = 0 //1 - critical, 2 - dead, 3 - oxygen indicator, 4 - toxin indicator, 5 - perfect health
|
||||
var/handling_hal = 0
|
||||
var/hal_crit = 0
|
||||
|
||||
|
||||
@@ -300,6 +300,11 @@
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov/attackby(obj/item/I, mob/user, params)
|
||||
if(is_hot(I) && !active)
|
||||
active = 1
|
||||
var/turf/bombturf = get_turf(src)
|
||||
var/area/bombarea = get_area(bombturf)
|
||||
message_admins("[key_name(user)]<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A> has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[bombarea] (JMP)</a>.")
|
||||
log_game("[key_name(user)] has primed a [name] for detonation at [bombarea] ([bombturf.x],[bombturf.y],[bombturf.z]).")
|
||||
|
||||
user << "<span class='info'>You light \the [src] on fire.</span>"
|
||||
overlays += fire_overlay
|
||||
if(!isGlass)
|
||||
@@ -324,4 +329,4 @@
|
||||
return
|
||||
user << "<span class='info'>You snuff out the flame on \the [src].</span>"
|
||||
overlays -= fire_overlay
|
||||
active = 0
|
||||
active = 0
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
/datum/table_recipe/appendixburger
|
||||
name = "Appendix burger"
|
||||
reqs = list(
|
||||
/obj/item/organ/appendix = 1,
|
||||
/obj/item/organ/internal/appendix = 1,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/appendix
|
||||
|
||||
@@ -171,6 +171,7 @@
|
||||
dat += "Leather Satchel: <A href='?src=\ref[src];create=satchel;amount=1'>Make</A> ([400/efficiency])<BR>"
|
||||
dat += "Leather Jacket: <A href='?src=\ref[src];create=jacket;amount=1'>Make</A> ([500/efficiency])<BR>"
|
||||
dat += "Leather Overcoat: <A href='?src=\ref[src];create=overcoat;amount=1'>Make</A> ([1000/efficiency])<BR>"
|
||||
dat += "Rice Hat: <A href='?src=\ref[src];create=rice_hat;amount=1'>Make</A> ([300/efficiency])<BR>"
|
||||
dat += "</div>"
|
||||
else
|
||||
dat += "<div class='statusDisplay'>No container inside, please insert container.</div>"
|
||||
@@ -309,9 +310,9 @@
|
||||
if("overcoat")
|
||||
if (check_cost(1000/efficiency)) return 0
|
||||
else new/obj/item/clothing/suit/jacket/leather/overcoat(src.loc)
|
||||
//if("monkey")
|
||||
// if (check_cost(500)) return 0
|
||||
// else new/mob/living/carbon/monkey(src.loc)
|
||||
if("rice_hat")
|
||||
if (check_cost(300/efficiency)) return 0
|
||||
else new/obj/item/clothing/head/rice_hat(src.loc)
|
||||
processing = 0
|
||||
menustat = "complete"
|
||||
update_icon()
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
if(89)
|
||||
new /obj/item/organ/brain/alien(src)
|
||||
if(90)
|
||||
new /obj/item/organ/heart(src)
|
||||
new /obj/item/organ/internal/heart(src)
|
||||
if(91)
|
||||
new /obj/item/device/soulstone/anybody(src)
|
||||
if(92)
|
||||
|
||||
@@ -623,7 +623,7 @@
|
||||
if(istype(I, /obj/item/weapon/weldingtool))
|
||||
var/obj/item/weapon/weldingtool/W = I
|
||||
if(W.welding && !stat)
|
||||
if(stance != HOSTILE_STANCE_IDLE)
|
||||
if(AIStatus == AI_ON)
|
||||
user << "<span class='info'>[src] is moving around too much to repair!</span>"
|
||||
return
|
||||
if(maxHealth == health)
|
||||
|
||||
@@ -129,6 +129,7 @@
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
force = 8.0
|
||||
var/digspeed = 20
|
||||
throwforce = 4.0
|
||||
item_state = "shovel"
|
||||
w_class = 3.0
|
||||
|
||||
@@ -432,9 +432,8 @@ var/global/list/rockTurfEdgeCache
|
||||
P.playDigSound()
|
||||
|
||||
if(do_after(user,P.digspeed, target = src))
|
||||
if(istype(src, /turf/simulated/mineral)) //sanity check against turf being deleted during digspeed delay
|
||||
if(istype(src, /turf/simulated/mineral))
|
||||
user << "<span class='notice'>You finish cutting into the rock.</span>"
|
||||
P.update_icon()
|
||||
gets_drilled(user)
|
||||
feedback_add_details("pick_used_mining","[P.name]")
|
||||
else
|
||||
@@ -457,6 +456,13 @@ var/global/list/rockTurfEdgeCache
|
||||
gets_drilled()
|
||||
..()
|
||||
|
||||
/turf/simulated/mineral/attack_alien(mob/living/carbon/alien/M)
|
||||
M << "<span class='notice'>You start digging into the rock...</span>"
|
||||
playsound(src, 'sound/effects/break_stone.ogg', 50, 1)
|
||||
if(do_after(M,40, target = src))
|
||||
M << "<span class='notice'>You tunnel into the rock.</span>"
|
||||
gets_drilled(M)
|
||||
|
||||
/*
|
||||
/turf/simulated/mineral/proc/setRandomMinerals()
|
||||
var/s = pickweight(list("uranium" = 5, "iron" = 50, "gold" = 5, "silver" = 5, "plasma" = 50, "diamond" = 1))
|
||||
@@ -541,27 +547,14 @@ var/global/list/rockTurfEdgeCache
|
||||
//note that this proc does not call ..()
|
||||
if(!W || !user)
|
||||
return 0
|
||||
|
||||
if ((istype(W, /obj/item/weapon/shovel)))
|
||||
var/turf/T = user.loc
|
||||
if (!( istype(T, /turf) ))
|
||||
return
|
||||
|
||||
if (dug)
|
||||
user << "<span class='warning'>This area has already been dug!</span>"
|
||||
return
|
||||
|
||||
user << "<span class='notice'>You start digging...</span>"
|
||||
playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) //FUCK YO RUSTLE I GOT'S THE DIGS SOUND HERE
|
||||
|
||||
sleep(20)
|
||||
if ((user.loc == T && user.get_active_hand() == W))
|
||||
user << "<span class='notice'>You dig a hole.</span>"
|
||||
gets_dug()
|
||||
return
|
||||
|
||||
if ((istype(W, /obj/item/weapon/pickaxe)))
|
||||
var/digging_speed = 0
|
||||
if (istype(W, /obj/item/weapon/shovel))
|
||||
var/obj/item/weapon/shovel/S = W
|
||||
digging_speed = S.digspeed
|
||||
else if (istype(W, /obj/item/weapon/pickaxe))
|
||||
var/obj/item/weapon/pickaxe/P = W
|
||||
digging_speed = P.digspeed
|
||||
if (digging_speed)
|
||||
var/turf/T = user.loc
|
||||
if (!( istype(T, /turf) ))
|
||||
return
|
||||
@@ -572,13 +565,13 @@ var/global/list/rockTurfEdgeCache
|
||||
|
||||
user << "<span class='notice'>You start digging...</span>"
|
||||
playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) //FUCK YO RUSTLE I GOT'S THE DIGS SOUND HERE
|
||||
|
||||
sleep(P.digspeed)
|
||||
if ((user.loc == T && user.get_active_hand() == W))
|
||||
user << "<span class='notice'>You dig a hole.</span>"
|
||||
gets_dug()
|
||||
return
|
||||
|
||||
|
||||
if(do_after(user, digging_speed, target = src))
|
||||
if(istype(src, /turf/simulated/floor/plating/asteroid))
|
||||
user << "<span class='notice'>You dig a hole.</span>"
|
||||
gets_dug()
|
||||
feedback_add_details("pick_used_mining","[W.name]")
|
||||
|
||||
if(istype(W,/obj/item/weapon/storage/bag/ore))
|
||||
var/obj/item/weapon/storage/bag/ore/S = W
|
||||
if(S.collection_mode == 1)
|
||||
|
||||
@@ -167,6 +167,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
mind.current.key = key
|
||||
return 1
|
||||
|
||||
/mob/dead/observer/proc/notify_cloning(var/message, var/sound)
|
||||
if(message)
|
||||
src << "<span class='ghostalert'>[message]</span>"
|
||||
src << "<span class='ghostalert'><a href=?src=\ref[src];reenter=1>(Click to re-enter)</a></span>"
|
||||
if(sound)
|
||||
src << sound(sound)
|
||||
|
||||
/mob/dead/observer/proc/dead_tele()
|
||||
set category = "Ghost"
|
||||
set name = "Teleport"
|
||||
@@ -363,8 +370,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
return ..()
|
||||
|
||||
/mob/dead/observer/Topic(href, href_list)
|
||||
if(href_list["follow"])
|
||||
var/atom/movable/target = locate(href_list["follow"])
|
||||
if((usr == src) && istype(target) && (target != src)) //for safety against href exploits
|
||||
ManualFollow(target)
|
||||
|
||||
..()
|
||||
if(usr == src)
|
||||
if(href_list["follow"])
|
||||
var/atom/movable/target = locate(href_list["follow"])
|
||||
if(istype(target) && (target != src))
|
||||
ManualFollow(target)
|
||||
if(href_list["reenter"])
|
||||
reenter_corpse()
|
||||
@@ -0,0 +1,115 @@
|
||||
//Travel through pools of blood. Slaughter Demon powers for everyone!
|
||||
|
||||
#define BLOODCRAWL 1
|
||||
#define BLOODCRAWL_EAT 2
|
||||
|
||||
/mob/living/proc/phaseout(obj/effect/decal/cleanable/B)
|
||||
var/mob/living/kidnapped = null
|
||||
var/turf/mobloc = get_turf(src.loc)
|
||||
var/turf/bloodloc = get_turf(B.loc)
|
||||
if(Adjacent(bloodloc))
|
||||
src.notransform = TRUE
|
||||
spawn(0)
|
||||
src.visible_message("[src] sinks into the pool of blood.")
|
||||
playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, 1, -1)
|
||||
var/obj/effect/dummy/slaughter/holder = PoolOrNew(/obj/effect/dummy/slaughter,mobloc)
|
||||
src.ExtinguishMob()
|
||||
if(src.buckled)
|
||||
src.buckled.unbuckle_mob()
|
||||
if(src.pulling && src.bloodcrawl == BLOODCRAWL_EAT)
|
||||
if(istype(src.pulling, /mob/living))
|
||||
var/mob/living/victim = src.pulling
|
||||
if(victim.stat == CONSCIOUS)
|
||||
src.visible_message("[victim] kicks free of the [src] at the last second!")
|
||||
else
|
||||
victim.loc = holder
|
||||
src.visible_message("<span class='warning'><B>The [src] drags [victim] into the pool of blood!</B>")
|
||||
kidnapped = victim
|
||||
src.loc = holder
|
||||
src.holder = holder
|
||||
if(kidnapped)
|
||||
src << "<B>You begin to feast on [kidnapped]. You can not move while you are doing this.</B>"
|
||||
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
|
||||
sleep(30)
|
||||
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
|
||||
sleep(30)
|
||||
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
|
||||
sleep(30)
|
||||
src << "<B>You devour [kidnapped]. Your health is fully restored.</B>"
|
||||
src.adjustBruteLoss(-1000)
|
||||
src.adjustFireLoss(-1000)
|
||||
src.adjustOxyLoss(-1000)
|
||||
src.adjustToxLoss(-1000)
|
||||
kidnapped.ghostize()
|
||||
qdel(kidnapped)
|
||||
src.notransform = 0
|
||||
|
||||
/mob/living/proc/phasein(obj/effect/decal/cleanable/B)
|
||||
if(src.notransform)
|
||||
src << "<B>Finish eating first!</B>"
|
||||
else
|
||||
src.loc = B.loc
|
||||
src.client.eye = src
|
||||
src.visible_message("<span class='warning'><B>The [src] rises out of the pool of blood!</B>")
|
||||
playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
|
||||
qdel(src.holder)
|
||||
src.holder = null
|
||||
|
||||
/obj/effect/decal/cleanable/blood/CtrlClick(mob/living/user)
|
||||
..()
|
||||
if(user.bloodcrawl)
|
||||
if(user.holder)
|
||||
user.phasein(src)
|
||||
else
|
||||
user.phaseout(src)
|
||||
|
||||
|
||||
/obj/effect/decal/cleanable/trail_holder/CtrlClick(mob/living/user)
|
||||
..()
|
||||
if(user.bloodcrawl)
|
||||
if(user.holder)
|
||||
user.phasein(src)
|
||||
else
|
||||
user.phaseout(src)
|
||||
|
||||
|
||||
|
||||
/turf/CtrlClick(var/mob/living/user)
|
||||
..()
|
||||
if(user.bloodcrawl)
|
||||
for(var/obj/effect/decal/cleanable/B in src.contents)
|
||||
if(istype(B, /obj/effect/decal/cleanable/blood) || istype(B, /obj/effect/decal/cleanable/trail_holder))
|
||||
if(user.holder)
|
||||
user.phasein(B)
|
||||
break
|
||||
else
|
||||
user.phaseout(B)
|
||||
break
|
||||
|
||||
/obj/effect/dummy/slaughter //Can't use the wizard one, blocked by jaunt/slow
|
||||
name = "water"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "nothing"
|
||||
var/canmove = 1
|
||||
density = 0
|
||||
anchored = 1
|
||||
invisibility = 60
|
||||
|
||||
obj/effect/dummy/slaughter/relaymove(mob/user, direction)
|
||||
if (!src.canmove || !direction) return
|
||||
var/turf/newLoc = get_step(src,direction)
|
||||
loc = newLoc
|
||||
src.canmove = 0
|
||||
spawn(1)
|
||||
src.canmove = 1
|
||||
|
||||
/obj/effect/dummy/slaughter/ex_act(blah)
|
||||
return
|
||||
/obj/effect/dummy/slaughter/bullet_act(blah)
|
||||
return
|
||||
|
||||
/obj/effect/dummy/slaughter/singularity_act(blah)
|
||||
return
|
||||
|
||||
/obj/effect/dummy/slaughter/Destroy()
|
||||
return QDEL_HINT_PUTINPOOL
|
||||
@@ -34,7 +34,12 @@
|
||||
/mob/living/carbon/alien/New()
|
||||
verbs += /mob/living/proc/mob_sleep
|
||||
verbs += /mob/living/proc/lay_down
|
||||
|
||||
internal_organs += new /obj/item/organ/brain/alien
|
||||
for(var/obj/item/organ/internal/I in internal_organs)
|
||||
I.Insert(src)
|
||||
|
||||
|
||||
AddAbility(new/obj/effect/proc_holder/alien/nightvisiontoggle(null))
|
||||
..()
|
||||
|
||||
@@ -54,7 +59,7 @@
|
||||
return storedPlasma
|
||||
|
||||
/mob/living/carbon/alien/check_eye_prot()
|
||||
return 2
|
||||
return ..() + 2
|
||||
|
||||
/mob/living/carbon/alien/getToxLoss()
|
||||
return 0
|
||||
@@ -185,7 +190,7 @@ Des: Gives the client of the alien an image on each infected mob.
|
||||
if (client)
|
||||
for (var/mob/living/C in mob_list)
|
||||
if(C.status_flags & XENO_HOST)
|
||||
var/obj/item/body_egg/alien_embryo/A = locate() in C
|
||||
var/obj/item/organ/internal/body_egg/alien_embryo/A = locate() in C
|
||||
var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[A.stage]")
|
||||
client.images += I
|
||||
return
|
||||
|
||||
@@ -6,56 +6,54 @@
|
||||
param = copytext(act, t1 + 1, length(act) + 1)
|
||||
act = copytext(act, 1, t1)
|
||||
|
||||
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
|
||||
act = copytext(act,1,length(act))
|
||||
var/muzzled = is_muzzled()
|
||||
var/m_type = 1
|
||||
var/message
|
||||
|
||||
switch(act) //Alphabetical please
|
||||
if ("deathgasp")
|
||||
if ("deathgasp","deathgasps")
|
||||
message = "<span class='name'>[src]</span> lets out a waning guttural screech, green blood bubbling from its maw..."
|
||||
m_type = 2
|
||||
|
||||
if ("gnarl")
|
||||
if ("gnarl","gnarls")
|
||||
if (!muzzled)
|
||||
message = "<span class='name'>[src]</span> gnarls and shows its teeth.."
|
||||
m_type = 2
|
||||
|
||||
if ("hiss")
|
||||
if ("hiss","hisses")
|
||||
if(!muzzled)
|
||||
message = "<span class='name'>[src]</span> hisses."
|
||||
m_type = 2
|
||||
|
||||
if ("moan")
|
||||
if ("moan","moans")
|
||||
message = "<span class='name'>[src]</span> moans!"
|
||||
m_type = 2
|
||||
|
||||
if ("roar")
|
||||
if ("roar","roars")
|
||||
if (!muzzled)
|
||||
message = "<span class='name'>[src]</span> roars."
|
||||
m_type = 2
|
||||
|
||||
if ("roll")
|
||||
if ("roll","rolls")
|
||||
if (!src.restrained())
|
||||
message = "<span class='name'>[src]</span> rolls."
|
||||
m_type = 1
|
||||
|
||||
if ("scratch")
|
||||
if ("scratch","scratches")
|
||||
if (!src.restrained())
|
||||
message = "<span class='name'>[src]</span> scratches."
|
||||
m_type = 1
|
||||
|
||||
if ("scretch")
|
||||
if ("screech","screeches")
|
||||
if (!muzzled)
|
||||
message = "<span class='name'>[src]</span> scretches."
|
||||
message = "<span class='name'>[src]</span> screeches."
|
||||
m_type = 2
|
||||
|
||||
if ("shiver")
|
||||
if ("shiver","shivers")
|
||||
message = "<span class='name'>[src]</span> shivers."
|
||||
m_type = 2
|
||||
|
||||
if ("sign")
|
||||
if ("sign","signs")
|
||||
if (!src.restrained())
|
||||
message = text("<span class='name'>[src]</span> signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null))
|
||||
m_type = 1
|
||||
@@ -65,7 +63,7 @@
|
||||
m_type = 1
|
||||
|
||||
if ("help") //This is an exception
|
||||
src << "Help for xenomorph emotes. You can use these emotes with say \"*emote\":\n\naflap, airguitar, blink, blink_r, blush, bow, burp, choke, chucke, clap, collapse, cough, dance, deathgasp, drool, flap, frown, gasp, giggle, glare-(none)/mob, gnarl, hiss, jump, laugh, look-atom, me, moan, nod, point-atom, roar, roll, scream, scratch, scretch, shake, shiver, sign-#, sit, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tail, tremble, twitch, twitch_s, wave, whimper, wink, yawn"
|
||||
src << "Help for xenomorph emotes. You can use these emotes with say \"*emote\":\n\naflap, airguitar, blink, blink_r, blush, bow, burp, choke, chucke, clap, collapse, cough, dance, deathgasp, drool, flap, frown, gasp, giggle, glare-(none)/mob, gnarl, hiss, jump, laugh, look-atom, me, moan, nod, point-atom, roar, roll, scream, scratch, screech, shake, shiver, sign-#, sit, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tail, tremble, twitch, twitch_s, wave, whimper, wink, yawn"
|
||||
|
||||
else
|
||||
..(act)
|
||||
|
||||
@@ -6,83 +6,81 @@
|
||||
param = copytext(act, t1 + 1, length(act) + 1)
|
||||
act = copytext(act, 1, t1)
|
||||
|
||||
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
|
||||
act = copytext(act,1,length(act))
|
||||
var/muzzled = is_muzzled()
|
||||
var/m_type = 1
|
||||
var/message
|
||||
|
||||
switch(act) //Alphabetically sorted please.
|
||||
if ("burp")
|
||||
if ("burp","burps")
|
||||
if (!muzzled)
|
||||
message = "<span class='name'>[src]</span> burps."
|
||||
m_type = 2
|
||||
if ("choke")
|
||||
if ("choke","chokes")
|
||||
message = "<span class='name'>[src]</span> chokes."
|
||||
m_type = 2
|
||||
if ("collapse")
|
||||
if ("collapse","collapses")
|
||||
Paralyse(2)
|
||||
message = "<span class='name'>[src]</span> collapses!"
|
||||
m_type = 2
|
||||
if ("dance")
|
||||
if ("dance","dances")
|
||||
if (!src.restrained())
|
||||
message = "<span class='name'>[src]</span> dances around happily."
|
||||
m_type = 1
|
||||
if ("drool")
|
||||
if ("drool","drools")
|
||||
message = "<span class='name'>[src]</span> drools."
|
||||
m_type = 1
|
||||
if ("gasp")
|
||||
if ("gasp","gasps")
|
||||
message = "<span class='name'>[src]</span> gasps."
|
||||
m_type = 2
|
||||
if ("gnarl")
|
||||
if ("gnarl","gnarls")
|
||||
if (!muzzled)
|
||||
message = "<span class='name'>[src]</span> gnarls and shows its teeth.."
|
||||
m_type = 2
|
||||
if ("hiss")
|
||||
if ("hiss","hisses")
|
||||
message = "<span class='name'>[src]</span> hisses softly."
|
||||
m_type = 1
|
||||
if ("jump")
|
||||
if ("jump","jumps")
|
||||
message = "<span class='name'>[src]</span> jumps!"
|
||||
m_type = 1
|
||||
if ("moan")
|
||||
if ("moan","moans")
|
||||
message = "<span class='name'>[src]</span> moans!"
|
||||
m_type = 2
|
||||
if ("nod")
|
||||
if ("nod","nods")
|
||||
message = "<span class='name'>[src]</span> nods its head."
|
||||
m_type = 1
|
||||
// if ("roar")
|
||||
// if (!muzzled)
|
||||
// message = "<span class='name'>[src]</span> roars." Commenting out since larva shouldn't roar /N
|
||||
// m_type = 2
|
||||
if ("roll")
|
||||
if ("roar","roars")
|
||||
if (!muzzled)
|
||||
message = "<span class='name'>[src]</span> softly roars."
|
||||
m_type = 2
|
||||
if ("roll","rolls")
|
||||
if (!src.restrained())
|
||||
message = "<span class='name'>[src]</span> rolls."
|
||||
m_type = 1
|
||||
if ("scratch")
|
||||
if ("scratch","scratches")
|
||||
if (!src.restrained())
|
||||
message = "<span class='name'>[src]</span> scratches."
|
||||
m_type = 1
|
||||
if ("scretch")
|
||||
if ("screech","screeches") //This orignally was called scretch, changing it. -Sum99
|
||||
if (!muzzled)
|
||||
message = "<span class='name'>[src]</span> scretches."
|
||||
message = "<span class='name'>[src]</span> screeches."
|
||||
m_type = 2
|
||||
if ("shake")
|
||||
if ("shake","shakes")
|
||||
message = "<span class='name'>[src]</span> shakes its head."
|
||||
m_type = 1
|
||||
if ("shiver")
|
||||
if ("shiver","shivers")
|
||||
message = "<span class='name'>[src]</span> shivers."
|
||||
m_type = 2
|
||||
if ("sign")
|
||||
if ("sign","signs")
|
||||
if (!src.restrained())
|
||||
message = text("<span class='name'>[src]</span> signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null))
|
||||
m_type = 1
|
||||
if ("snore")
|
||||
if ("snore","snores")
|
||||
message = "<B>[src]</B> snores."
|
||||
m_type = 2
|
||||
if ("sulk")
|
||||
if ("sulk","sulks")
|
||||
message = "<span class='name'>[src]</span> sulks down sadly."
|
||||
m_type = 1
|
||||
if ("sway")
|
||||
if ("sway","sways")
|
||||
message = "<span class='name'>[src]</span> sways around dizzily."
|
||||
m_type = 1
|
||||
if ("tail")
|
||||
@@ -91,13 +89,13 @@
|
||||
if ("twitch")
|
||||
message = "<span class='name'>[src]</span> twitches violently."
|
||||
m_type = 1
|
||||
if ("whimper")
|
||||
if ("whimper","whimpers")
|
||||
if (!muzzled)
|
||||
message = "<span class='name'>[src]</span> whimpers."
|
||||
m_type = 2
|
||||
|
||||
if ("help") //"The exception"
|
||||
src << "Help for larva emotes. You can use these emotes with say \"*emote\":\n\nburp, choke, collapse, dance, drool, gasp, gnarl, hiss, jump, moan, nod, roll, scratch,\nscretch, shake, shiver, sign-#, sulk, sway, tail, twitch, whimper"
|
||||
src << "Help for larva emotes. You can use these emotes with say \"*emote\":\n\nburp, choke, collapse, dance, drool, gasp, gnarl, hiss, jump, moan, nod, roll, roar, scratch, screech, shake, shiver, sign-#, sulk, sway, tail, twitch, whimper"
|
||||
|
||||
else
|
||||
src << "<span class='info'>Unusable emote '[act]'. Say *help for a list.</span>"
|
||||
|
||||
@@ -2,55 +2,53 @@
|
||||
// It functions almost identically (see code/datums/diseases/alien_embryo.dm)
|
||||
var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds
|
||||
|
||||
/obj/item/body_egg/alien_embryo
|
||||
/obj/item/organ/internal/body_egg/alien_embryo
|
||||
name = "alien embryo"
|
||||
icon = 'icons/mob/alien.dmi'
|
||||
icon_state = "larva0_dead"
|
||||
var/stage = 0
|
||||
|
||||
/obj/item/body_egg/alien_embryo/egg_process()
|
||||
/obj/item/organ/internal/body_egg/alien_embryo/on_life()
|
||||
switch(stage)
|
||||
if(2, 3)
|
||||
if(prob(1))
|
||||
owner.emote("sneeze")
|
||||
if(prob(1))
|
||||
owner.emote("cough")
|
||||
if(prob(1))
|
||||
owner << "<span class='danger'>Your throat feels sore.</span>"
|
||||
if(prob(1))
|
||||
owner << "<span class='danger'>Mucous runs down the back of your throat.</span>"
|
||||
if(4)
|
||||
if(prob(1))
|
||||
owner.emote("sneeze")
|
||||
if(prob(1))
|
||||
owner.emote("cough")
|
||||
if(prob(2))
|
||||
owner << "<span class='danger'>Your muscles ache.</span>"
|
||||
if(prob(20))
|
||||
owner.take_organ_damage(1)
|
||||
if(prob(2))
|
||||
owner << "<span class='danger'>Your stomach hurts.</span>"
|
||||
if(prob(20))
|
||||
owner.adjustToxLoss(1)
|
||||
if(5)
|
||||
owner << "<span class='danger'>You feel something tearing its way out of your stomach...</span>"
|
||||
owner.adjustToxLoss(10)
|
||||
|
||||
/obj/item/organ/internal/body_egg/alien_embryo/egg_process()
|
||||
if(stage < 5 && prob(3))
|
||||
stage++
|
||||
spawn(0)
|
||||
RefreshInfectionImage()
|
||||
|
||||
switch(stage)
|
||||
if(2, 3)
|
||||
if(affected_mob == DEAD)
|
||||
return
|
||||
if(prob(1))
|
||||
affected_mob.emote("sneeze")
|
||||
if(prob(1))
|
||||
affected_mob.emote("cough")
|
||||
if(prob(1))
|
||||
affected_mob << "<span class='danger'>Your throat feels sore.</span>"
|
||||
if(prob(1))
|
||||
affected_mob << "<span class='danger'>Mucous runs down the back of your throat.</span>"
|
||||
if(4)
|
||||
if(affected_mob == DEAD)
|
||||
return
|
||||
if(prob(1))
|
||||
affected_mob.emote("sneeze")
|
||||
if(prob(1))
|
||||
affected_mob.emote("cough")
|
||||
if(prob(2))
|
||||
affected_mob << "<span class='danger'>Your muscles ache.</span>"
|
||||
if(prob(20))
|
||||
affected_mob.take_organ_damage(1)
|
||||
if(prob(2))
|
||||
affected_mob << "<span class='danger'>Your stomach hurts.</span>"
|
||||
if(prob(20))
|
||||
affected_mob.adjustToxLoss(1)
|
||||
affected_mob.updatehealth()
|
||||
if(5)
|
||||
if(affected_mob != DEAD)
|
||||
affected_mob << "<span class='danger'>You feel something tearing its way out of your stomach...</span>"
|
||||
affected_mob.adjustToxLoss(10)
|
||||
affected_mob.updatehealth()
|
||||
if(prob(50))
|
||||
AttemptGrow()
|
||||
if(stage == 5 && prob(50))
|
||||
AttemptGrow()
|
||||
|
||||
|
||||
|
||||
/obj/item/body_egg/alien_embryo/proc/AttemptGrow(gib_on_success = 1)
|
||||
/obj/item/organ/internal/body_egg/alien_embryo/proc/AttemptGrow(gib_on_success = 1)
|
||||
if(!owner) return
|
||||
var/list/candidates = get_candidates(BE_ALIEN, ALIEN_AFK_BRACKET)
|
||||
var/client/C = null
|
||||
|
||||
@@ -61,55 +59,47 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds
|
||||
|
||||
if(candidates.len)
|
||||
C = pick(candidates)
|
||||
else if(affected_mob.client)
|
||||
C = affected_mob.client
|
||||
else if(owner.client)
|
||||
C = owner.client
|
||||
else
|
||||
stage = 4 // Let's try again later.
|
||||
return
|
||||
|
||||
if(affected_mob.lying)
|
||||
affected_mob.overlays += image('icons/mob/alien.dmi', loc = affected_mob, icon_state = "burst_lie")
|
||||
if(owner.lying)
|
||||
owner.overlays += image('icons/mob/alien.dmi', loc = owner, icon_state = "burst_lie")
|
||||
else
|
||||
affected_mob.overlays += image('icons/mob/alien.dmi', loc = affected_mob, icon_state = "burst_stand")
|
||||
owner.overlays += image('icons/mob/alien.dmi', loc = owner, icon_state = "burst_stand")
|
||||
spawn(6)
|
||||
var/location = get_turf(affected_mob)
|
||||
if(!location)
|
||||
location = affected_mob.loc
|
||||
var/mob/living/carbon/alien/larva/new_xeno = new(location)
|
||||
var/atom/xeno_loc = owner
|
||||
if(!gib_on_success)
|
||||
xeno_loc = get_turf(xeno_loc)
|
||||
|
||||
var/mob/living/carbon/alien/larva/new_xeno = new(xeno_loc)
|
||||
new_xeno.key = C.key
|
||||
new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100) //To get the player's attention
|
||||
if(gib_on_success)
|
||||
affected_mob.gib()
|
||||
if(istype(new_xeno.loc,/mob/living/carbon))
|
||||
var/mob/living/carbon/digester = new_xeno.loc
|
||||
digester.stomach_contents += new_xeno
|
||||
owner.stomach_contents += new_xeno
|
||||
owner.gib()
|
||||
qdel(src)
|
||||
|
||||
/*----------------------------------------
|
||||
Proc: RefreshInfectionImage()
|
||||
Des: Removes the current icons located in the infected mob adds the current stage
|
||||
----------------------------------------*/
|
||||
/obj/item/body_egg/alien_embryo/RefreshInfectionImage()
|
||||
RemoveInfectionImages()
|
||||
AddInfectionImages()
|
||||
|
||||
/*----------------------------------------
|
||||
Proc: AddInfectionImages(C)
|
||||
Des: Adds the infection image to all aliens for this embryo
|
||||
----------------------------------------*/
|
||||
/obj/item/body_egg/alien_embryo/AddInfectionImages()
|
||||
/obj/item/organ/internal/body_egg/alien_embryo/AddInfectionImages()
|
||||
for(var/mob/living/carbon/alien/alien in player_list)
|
||||
if(alien.client)
|
||||
var/I = image('icons/mob/alien.dmi', loc = affected_mob, icon_state = "infected[stage]")
|
||||
var/I = image('icons/mob/alien.dmi', loc = owner, icon_state = "infected[stage]")
|
||||
alien.client.images += I
|
||||
|
||||
/*----------------------------------------
|
||||
Proc: RemoveInfectionImage(C)
|
||||
Des: Removes all images from the mob infected by this embryo
|
||||
----------------------------------------*/
|
||||
/obj/item/body_egg/alien_embryo/RemoveInfectionImages()
|
||||
/obj/item/organ/internal/body_egg/alien_embryo/RemoveInfectionImages()
|
||||
for(var/mob/living/carbon/alien/alien in player_list)
|
||||
if(alien.client)
|
||||
for(var/image/I in alien.client.images)
|
||||
if(dd_hasprefix_case(I.icon_state, "infected") && I.loc == affected_mob)
|
||||
if(dd_hasprefix_case(I.icon_state, "infected") && I.loc == owner)
|
||||
qdel(I)
|
||||
|
||||
@@ -87,7 +87,7 @@ var/const/MAX_ACTIVE_TIME = 400
|
||||
return Attach(AM)
|
||||
return 0
|
||||
|
||||
/obj/item/clothing/mask/facehugger/throw_at(atom/target, range, speed)
|
||||
/obj/item/clothing/mask/facehugger/throw_at(atom/target, range, speed, mob/thrower, spin)
|
||||
if(!..())
|
||||
return
|
||||
if(stat == CONSCIOUS)
|
||||
@@ -116,7 +116,7 @@ var/const/MAX_ACTIVE_TIME = 400
|
||||
|
||||
if(loc == L) return 0
|
||||
if(stat != CONSCIOUS) return 0
|
||||
if(locate(/obj/item/body_egg/alien_embryo) in L) return 0
|
||||
if(locate(/obj/item/organ/internal/body_egg/alien_embryo) in L) return 0
|
||||
if(!sterile) L.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage
|
||||
|
||||
L.visible_message("<span class='danger'>[src] leaps at [L]'s face!</span>", \
|
||||
@@ -176,8 +176,7 @@ var/const/MAX_ACTIVE_TIME = 400
|
||||
icon_state = "[initial(icon_state)]_impregnated"
|
||||
|
||||
if(!target.getlimb(/obj/item/organ/limb/robot/chest) && !(target.status_flags & XENO_HOST))
|
||||
new /obj/item/body_egg/alien_embryo(target)
|
||||
|
||||
new /obj/item/organ/internal/body_egg/alien_embryo(target)
|
||||
|
||||
if(iscorgi(target))
|
||||
var/mob/living/simple_animal/pet/dog/corgi/C = target
|
||||
|
||||
@@ -9,11 +9,6 @@
|
||||
origin_tech = "biotech=3"
|
||||
var/braintype = "Cyborg"
|
||||
|
||||
req_access = list(access_robotics)
|
||||
|
||||
//Revised. Brainmob is now contained directly within object of transfer. MMI in this case.
|
||||
|
||||
var/locked = 0
|
||||
var/syndiemmi = 0 //Whether or not this is a Syndicate MMI
|
||||
var/mob/living/carbon/brain/brainmob = null //The current occupant.
|
||||
var/mob/living/silicon/robot = null //Appears unused.
|
||||
@@ -31,12 +26,6 @@
|
||||
else
|
||||
icon_state = "mmi_empty"
|
||||
|
||||
/obj/item/device/mmi/Topic(href, href_list)
|
||||
if(href_list["reenter"])
|
||||
var/mob/dead/observer/ghost = usr
|
||||
if(istype(ghost))
|
||||
ghost.reenter_corpse(ghost)
|
||||
|
||||
/obj/item/device/mmi/attackby(obj/item/O, mob/user, params)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
if(istype(O,/obj/item/organ/brain)) //Time to stick a brain in it --NEO
|
||||
@@ -52,11 +41,7 @@
|
||||
return
|
||||
var/mob/living/carbon/brain/B = newbrain.brainmob
|
||||
if(!B.key)
|
||||
var/mob/dead/observer/ghost = B.get_ghost()
|
||||
if(ghost)
|
||||
if(ghost.client)
|
||||
ghost << "<span class='ghostalert'>Someone has put your brain in a MMI!</span> <a href=?src=\ref[src];reenter=1>(Click to enter)</a>"
|
||||
ghost << sound('sound/effects/genetics.ogg')
|
||||
B.notify_ghost_cloning("Someone has put your brain in a MMI!")
|
||||
visible_message("[user] sticks \a [newbrain] into \the [src].")
|
||||
|
||||
brainmob = newbrain.brainmob
|
||||
@@ -73,19 +58,10 @@
|
||||
name = "Man-Machine Interface: [brainmob.real_name]"
|
||||
update_icon()
|
||||
|
||||
locked = 1
|
||||
|
||||
feedback_inc("cyborg_mmis_filled",1)
|
||||
|
||||
return
|
||||
|
||||
if((istype(O,/obj/item/weapon/card/id)||istype(O,/obj/item/device/pda)) && brainmob)
|
||||
if(allowed(user))
|
||||
locked = !locked
|
||||
user << "<span class='notice'>You [locked ? "lock" : "unlock"] the brain holder.</span>"
|
||||
else
|
||||
user << "<span class='danger'>Access denied.</span>"
|
||||
return
|
||||
if(brainmob)
|
||||
O.attack(brainmob, user) //Oh noooeeeee
|
||||
return
|
||||
@@ -94,10 +70,8 @@
|
||||
/obj/item/device/mmi/attack_self(mob/user)
|
||||
if(!brain)
|
||||
user << "<span class='warning'>You upend the MMI, but there's nothing in it!</span>"
|
||||
else if(locked)
|
||||
user << "<span class='warning'>You upend the MMI, but the brain is clamped into place!</span>"
|
||||
else
|
||||
user << "<span class='notice'>You upend the MMI, spilling the brain onto the floor.</span>"
|
||||
user << "<span class='notice'>You unlock and upend the MMI, spilling the brain onto the floor.</span>"
|
||||
|
||||
brainmob.container = null //Reset brainmob mmi var.
|
||||
brainmob.loc = brain //Throw mob into brain.
|
||||
@@ -126,7 +100,6 @@
|
||||
|
||||
name = "Man-Machine Interface: [brainmob.real_name]"
|
||||
update_icon()
|
||||
locked = 1
|
||||
return
|
||||
|
||||
/obj/item/device/mmi/radio_enabled
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
layer = 4.1
|
||||
origin_tech = "biotech=3"
|
||||
origin_tech = "biotech=4"
|
||||
attack_verb = list("attacked", "slapped", "whacked")
|
||||
var/mob/living/carbon/brain/brainmob = null
|
||||
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
var/t1 = findtext(act, "-", 1, null)
|
||||
act = copytext(act, 1, t1)
|
||||
|
||||
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
|
||||
act = copytext(act,1,length(act))
|
||||
|
||||
if(src.stat == DEAD)
|
||||
return
|
||||
@@ -22,16 +20,16 @@
|
||||
message = "<B>[src]</B> lets out a distressed noise."
|
||||
m_type = 2
|
||||
|
||||
if ("beep")
|
||||
if ("beep","beeps")
|
||||
src << "You beep."
|
||||
message = "<B>[src]</B> beeps."
|
||||
m_type = 2
|
||||
|
||||
if ("blink")
|
||||
if ("blink","blinks")
|
||||
message = "<B>[src]</B> blinks."
|
||||
m_type = 1
|
||||
|
||||
if ("boop")
|
||||
if ("boop","boops")
|
||||
src << "You boop."
|
||||
message = "<B>[src]</B> boops."
|
||||
m_type = 2
|
||||
@@ -45,7 +43,7 @@
|
||||
message = "<B>[src]</B> plays a loud tone."
|
||||
m_type = 2
|
||||
|
||||
if ("whistle")
|
||||
if ("whistle","whistles")
|
||||
src << "You whistle."
|
||||
message = "<B>[src]</B> whistles."
|
||||
m_type = 2
|
||||
|
||||
@@ -11,7 +11,6 @@ var/global/posibrain_notif_cooldown = 0
|
||||
var/askDelay = 10 * 60 * 1
|
||||
brainmob = null
|
||||
req_access = list(access_robotics)
|
||||
locked = 0
|
||||
mecha = null//This does not appear to be used outside of reference in mecha.dm.
|
||||
braintype = "Android"
|
||||
|
||||
|
||||
@@ -530,4 +530,16 @@ var/const/GALOSHES_DONT_HELP = 8
|
||||
I.throw_at(target,I.throw_range,I.throw_speed,src)
|
||||
if(61 to 90) //throw it down to the floor
|
||||
var/turf/target = get_turf(loc)
|
||||
I.throw_at(target,I.throw_range,I.throw_speed,src)
|
||||
I.throw_at(target,I.throw_range,I.throw_speed,src)
|
||||
|
||||
/mob/living/carbon/emp_act(severity)
|
||||
for(var/obj/item/organ/internal/O in internal_organs)
|
||||
O.emp_act(severity)
|
||||
..()
|
||||
|
||||
|
||||
/mob/living/carbon/check_eye_prot()
|
||||
var/number = ..()
|
||||
for(var/obj/item/organ/internal/cyberimp/eyes/EFP in internal_organs)
|
||||
number += EFP.flash_protect
|
||||
return number
|
||||
@@ -11,6 +11,11 @@
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/throw_impact(atom/hit_atom)
|
||||
. = ..()
|
||||
if(hit_atom.density && isturf(hit_atom))
|
||||
Weaken(1)
|
||||
take_organ_damage(10)
|
||||
|
||||
/mob/living/carbon/attackby(obj/item/I, mob/user, params)
|
||||
if(lying)
|
||||
|
||||
@@ -10,9 +10,6 @@
|
||||
param = copytext(act, t1 + 1, length(act) + 1)
|
||||
act = copytext(act, 1, t1)
|
||||
|
||||
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
|
||||
act = copytext(act,1,length(act))
|
||||
|
||||
var/muzzled = is_muzzled()
|
||||
//var/m_type = 1
|
||||
|
||||
@@ -27,7 +24,7 @@
|
||||
message = "<B>[src]</B> is strumming the air and headbanging like a safari chimp."
|
||||
m_type = 1
|
||||
|
||||
if ("blink")
|
||||
if ("blink","blinks")
|
||||
message = "<B>[src]</B> blinks."
|
||||
m_type = 1
|
||||
|
||||
@@ -35,11 +32,11 @@
|
||||
message = "<B>[src]</B> blinks rapidly."
|
||||
m_type = 1
|
||||
|
||||
if ("blush")
|
||||
if ("blush","blushes")
|
||||
message = "<B>[src]</B> blushes."
|
||||
m_type = 1
|
||||
|
||||
if ("bow")
|
||||
if ("bow","bows")
|
||||
if (!src.buckled)
|
||||
var/M = null
|
||||
if (param)
|
||||
@@ -55,117 +52,117 @@
|
||||
message = "<B>[src]</B> bows."
|
||||
m_type = 1
|
||||
|
||||
if ("burp")
|
||||
if ("burp","burps")
|
||||
if (!muzzled)
|
||||
..(act)
|
||||
|
||||
if ("choke")
|
||||
if ("choke","chokes")
|
||||
if (!muzzled)
|
||||
..(act)
|
||||
else
|
||||
message = "<B>[src]</B> makes a strong noise."
|
||||
m_type = 2
|
||||
|
||||
if ("chuckle")
|
||||
if ("chuckle","chuckles")
|
||||
if (!muzzled)
|
||||
..(act)
|
||||
else
|
||||
message = "<B>[src]</B> makes a noise."
|
||||
m_type = 2
|
||||
|
||||
if ("clap")
|
||||
if ("clap","claps")
|
||||
if (!src.restrained())
|
||||
message = "<B>[src]</B> claps."
|
||||
m_type = 2
|
||||
|
||||
if ("cough")
|
||||
if ("cough","coughs")
|
||||
if (!muzzled)
|
||||
..(act)
|
||||
else
|
||||
message = "<B>[src]</B> makes a strong noise."
|
||||
m_type = 2
|
||||
|
||||
if ("deathgasp")
|
||||
if ("deathgasp","deathgasps")
|
||||
message = "<B>[src]</B> seizes up and falls limp, \his eyes dead and lifeless..."
|
||||
m_type = 1
|
||||
|
||||
if ("flap")
|
||||
if ("flap","flaps")
|
||||
if (!src.restrained())
|
||||
message = "<B>[src]</B> flaps \his wings."
|
||||
m_type = 2
|
||||
|
||||
if ("gasp")
|
||||
if ("gasp","gasps")
|
||||
if (!muzzled)
|
||||
..(act)
|
||||
else
|
||||
message = "<B>[src]</B> makes a weak noise."
|
||||
m_type = 2
|
||||
|
||||
if ("giggle")
|
||||
if ("giggle","giggles")
|
||||
if (!muzzled)
|
||||
..(act)
|
||||
else
|
||||
message = "<B>[src]</B> makes a noise."
|
||||
m_type = 2
|
||||
|
||||
if ("laugh")
|
||||
if ("laugh","laughs")
|
||||
if (!muzzled)
|
||||
..(act)
|
||||
else
|
||||
message = "<B>[src]</B> makes a noise."
|
||||
|
||||
if ("nod")
|
||||
if ("nod","nods")
|
||||
message = "<B>[src]</B> nods."
|
||||
m_type = 1
|
||||
|
||||
if ("scream")
|
||||
if ("scream","screams")
|
||||
if (!muzzled)
|
||||
..(act)
|
||||
else
|
||||
message = "<B>[src]</B> makes a very loud noise."
|
||||
m_type = 2
|
||||
|
||||
if ("shake")
|
||||
if ("shake","shakes")
|
||||
message = "<B>[src]</B> shakes \his head."
|
||||
m_type = 1
|
||||
|
||||
if ("sneeze")
|
||||
if ("sneeze","sneezes")
|
||||
if (!muzzled)
|
||||
..(act)
|
||||
else
|
||||
message = "<B>[src]</B> makes a strange noise."
|
||||
m_type = 2
|
||||
|
||||
if ("sigh")
|
||||
if ("sigh","sighs")
|
||||
if (!muzzled)
|
||||
..(act)
|
||||
else
|
||||
message = "<B>[src]</B> sighs."
|
||||
m_type = 2
|
||||
|
||||
if ("sniff")
|
||||
if ("sniff","sniffs")
|
||||
message = "<B>[src]</B> sniffs."
|
||||
m_type = 2
|
||||
|
||||
if ("snore")
|
||||
if ("snore","snores")
|
||||
if (!muzzled)
|
||||
..(act)
|
||||
else
|
||||
message = "<B>[src]</B> makes a noise."
|
||||
m_type = 2
|
||||
|
||||
if ("whimper")
|
||||
if ("whimper","whimpers")
|
||||
if (!muzzled)
|
||||
..(act)
|
||||
else
|
||||
message = "<B>[src]</B> makes a weak noise."
|
||||
m_type = 2
|
||||
|
||||
if ("wink")
|
||||
if ("wink","winks")
|
||||
message = "<B>[src]</B> winks."
|
||||
m_type = 1
|
||||
|
||||
if ("yawn")
|
||||
if ("yawn","yawns")
|
||||
if (!muzzled)
|
||||
..(act)
|
||||
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
param = copytext(act, t1 + 1, length(act) + 1)
|
||||
act = copytext(act, 1, t1)
|
||||
|
||||
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
|
||||
act = copytext(act,1,length(act))
|
||||
|
||||
var/muzzled = is_muzzled()
|
||||
//var/m_type = 1
|
||||
@@ -28,29 +26,29 @@
|
||||
message = "<B>[src]</B> flaps \his wings ANGRILY!"
|
||||
m_type = 2
|
||||
|
||||
if ("choke")
|
||||
if ("choke","chokes")
|
||||
if (miming)
|
||||
message = "<B>[src]</B> clutches \his throat desperately!"
|
||||
else
|
||||
..(act)
|
||||
|
||||
if ("chuckle")
|
||||
if ("chuckle","chuckles")
|
||||
if(miming)
|
||||
message = "<B>[src]</B> appears to chuckle."
|
||||
else
|
||||
..(act)
|
||||
|
||||
if ("clap")
|
||||
if ("clap","claps")
|
||||
if (!src.restrained())
|
||||
message = "<B>[src]</B> claps."
|
||||
m_type = 2
|
||||
|
||||
if ("collapse")
|
||||
if ("collapse","collapses")
|
||||
Paralyse(2)
|
||||
message = "<B>[src]</B> collapses!"
|
||||
m_type = 2
|
||||
|
||||
if ("cough")
|
||||
if ("cough","coughs")
|
||||
if (miming)
|
||||
message = "<B>[src]</B> appears to cough!"
|
||||
else
|
||||
@@ -61,7 +59,7 @@
|
||||
message = "<B>[src]</B> makes a strong noise."
|
||||
m_type = 2
|
||||
|
||||
if ("cry")
|
||||
if ("cry","crys","cries") //I feel bad if people put s at the end of cry. -Sum99
|
||||
if (miming)
|
||||
message = "<B>[src]</B> cries."
|
||||
else
|
||||
@@ -101,7 +99,7 @@
|
||||
return
|
||||
message = "<B>[src]</B> [input]"
|
||||
|
||||
if ("dap")
|
||||
if ("dap","daps")
|
||||
m_type = 1
|
||||
if (!src.restrained())
|
||||
var/M = null
|
||||
@@ -119,24 +117,24 @@
|
||||
message = "<B>[src]</B> raises an eyebrow."
|
||||
m_type = 1
|
||||
|
||||
if ("flap")
|
||||
if ("flap","flaps")
|
||||
if (!src.restrained())
|
||||
message = "<B>[src]</B> flaps \his wings."
|
||||
m_type = 2
|
||||
|
||||
if ("gasp")
|
||||
if ("gasp","gasps")
|
||||
if (miming)
|
||||
message = "<B>[src]</B> appears to be gasping!"
|
||||
else
|
||||
..(act)
|
||||
|
||||
if ("giggle")
|
||||
if ("giggle","giggles")
|
||||
if (miming)
|
||||
message = "<B>[src]</B> giggles silently!"
|
||||
else
|
||||
..(act)
|
||||
|
||||
if ("groan")
|
||||
if ("groan","groans")
|
||||
if (miming)
|
||||
message = "<B>[src]</B> appears to groan!"
|
||||
else
|
||||
@@ -147,7 +145,7 @@
|
||||
message = "<B>[src]</B> makes a loud noise."
|
||||
m_type = 2
|
||||
|
||||
if ("grumble")
|
||||
if ("grumble","grumbles")
|
||||
if (!muzzled)
|
||||
message = "<B>[src]</B> grumbles!"
|
||||
else
|
||||
@@ -171,7 +169,7 @@
|
||||
else
|
||||
message = "<B>[src]</B> holds out \his hand to [M]."
|
||||
|
||||
if ("hug")
|
||||
if ("hug","hugs")
|
||||
m_type = 1
|
||||
if (!src.restrained())
|
||||
var/M = null
|
||||
@@ -215,14 +213,14 @@
|
||||
else
|
||||
message = "<B>[src]</B> [message]"
|
||||
|
||||
if ("moan")
|
||||
if ("moan","moans")
|
||||
if(miming)
|
||||
message = "<B>[src]</B> appears to moan!"
|
||||
else
|
||||
message = "<B>[src]</B> moans!"
|
||||
m_type = 2
|
||||
|
||||
if ("mumble")
|
||||
if ("mumble","mumbles")
|
||||
message = "<B>[src]</B> mumbles!"
|
||||
m_type = 2
|
||||
|
||||
@@ -235,7 +233,7 @@
|
||||
message = "<B>[src]</B> raises a hand."
|
||||
m_type = 1
|
||||
|
||||
if ("salute")
|
||||
if ("salute","salutes")
|
||||
if (!src.buckled)
|
||||
var/M = null
|
||||
if (param)
|
||||
@@ -251,27 +249,27 @@
|
||||
message = "<B>[src]</b> salutes."
|
||||
m_type = 1
|
||||
|
||||
if ("scream")
|
||||
if ("scream","screams")
|
||||
if (miming)
|
||||
message = "<B>[src]</B> acts out a scream!"
|
||||
else
|
||||
..(act)
|
||||
|
||||
if ("shiver")
|
||||
if ("shiver","shivers")
|
||||
message = "<B>[src]</B> shivers."
|
||||
m_type = 1
|
||||
|
||||
if ("shrug")
|
||||
if ("shrug","shrugs")
|
||||
message = "<B>[src]</B> shrugs."
|
||||
m_type = 1
|
||||
|
||||
if ("sigh")
|
||||
if ("sigh","sighs")
|
||||
if(miming)
|
||||
message = "<B>[src]</B> sighs."
|
||||
else
|
||||
..(act)
|
||||
|
||||
if ("signal")
|
||||
if ("signal","signals")
|
||||
if (!src.restrained())
|
||||
var/t1 = round(text2num(param))
|
||||
if (isnum(t1))
|
||||
@@ -281,34 +279,34 @@
|
||||
message = "<B>[src]</B> raises [t1] finger\s."
|
||||
m_type = 1
|
||||
|
||||
if ("sneeze")
|
||||
if ("sneeze","sneezes")
|
||||
if (miming)
|
||||
message = "<B>[src]</B> sneezes."
|
||||
else
|
||||
..(act)
|
||||
|
||||
if ("sniff")
|
||||
if ("sniff","sniffs")
|
||||
message = "<B>[src]</B> sniffs."
|
||||
m_type = 2
|
||||
|
||||
if ("snore")
|
||||
if ("snore","snores")
|
||||
if (miming)
|
||||
message = "<B>[src]</B> sleeps soundly."
|
||||
else
|
||||
..(act)
|
||||
|
||||
if ("whimper")
|
||||
if ("whimper","whimpers")
|
||||
if (miming)
|
||||
message = "<B>[src]</B> appears hurt."
|
||||
else
|
||||
..(act)
|
||||
|
||||
if ("yawn")
|
||||
if ("yawn","yawns")
|
||||
if (!muzzled)
|
||||
message = "<B>[src]</B> yawns."
|
||||
m_type = 2
|
||||
|
||||
if("wag")
|
||||
if("wag","wags")
|
||||
if(dna && dna.species && (("tail_lizard" in dna.species.mutant_bodyparts) || (features["tail_human"] != "None")))
|
||||
message = "<B>[src]</B> wags \his tail."
|
||||
startTailWag()
|
||||
|
||||
@@ -263,10 +263,12 @@
|
||||
if(digitalcamo)
|
||||
msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly inhuman manner.\n"
|
||||
|
||||
if(!wear_mask && is_thrall(src) && in_range(user,src))
|
||||
msg += "Their features seem unnaturally tight and drawn.\n"
|
||||
|
||||
if(istype(user, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/obj/item/cybernetic_implant/eyes/hud/CIH = locate(/obj/item/cybernetic_implant/eyes/hud) in H.internal_organs
|
||||
var/obj/item/organ/internal/cyberimp/eyes/hud/CIH = H.getorgan(/obj/item/organ/internal/cyberimp/eyes/hud)
|
||||
if(istype(H.glasses, /obj/item/clothing/glasses/hud) || CIH)
|
||||
var/perpname = get_face_name(get_id_name(""))
|
||||
if(perpname)
|
||||
@@ -275,9 +277,9 @@
|
||||
msg += "<span class='deptradio'>Rank:</span> [R.fields["rank"]]<br>"
|
||||
msg += "<a href='?src=\ref[src];hud=1;photo_front=1'>\[Front photo\]</a> "
|
||||
msg += "<a href='?src=\ref[src];hud=1;photo_side=1'>\[Side photo\]</a><br>"
|
||||
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(CIH,/obj/item/cybernetic_implant/eyes/hud/medical))
|
||||
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(CIH,/obj/item/organ/internal/cyberimp/eyes/hud/medical))
|
||||
var/implant_detect
|
||||
for(var/obj/item/cybernetic_implant/CI in internal_organs)
|
||||
for(var/obj/item/organ/internal/cyberimp/CI in internal_organs)
|
||||
implant_detect += "[name] is modified with a [CI.name].<br>"
|
||||
if(implant_detect)
|
||||
msg += "Detected cybernetic modifications:<br>"
|
||||
@@ -292,8 +294,9 @@
|
||||
msg += "<a href='?src=\ref[src];hud=m;evaluation=1'>\[Medical evaluation\]</a><br>"
|
||||
|
||||
|
||||
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(CIH,/obj/item/cybernetic_implant/eyes/hud/security))
|
||||
if(!user.stat && user != src) //|| !user.canmove || user.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at.
|
||||
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(CIH,/obj/item/organ/internal/cyberimp/eyes/hud/security))
|
||||
if(!user.stat && user != src)
|
||||
//|| !user.canmove || user.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at.
|
||||
var/criminal = "None"
|
||||
|
||||
R = find_record("name", perpname, data_core.security)
|
||||
|
||||
@@ -22,10 +22,13 @@
|
||||
/obj/item/organ/limb/r_arm, /obj/item/organ/limb/r_leg, /obj/item/organ/limb/l_leg)
|
||||
for(var/obj/item/organ/limb/O in organs)
|
||||
O.owner = src
|
||||
internal_organs += new /obj/item/organ/appendix
|
||||
internal_organs += new /obj/item/organ/heart
|
||||
internal_organs += new /obj/item/organ/internal/appendix
|
||||
internal_organs += new /obj/item/organ/internal/heart
|
||||
internal_organs += new /obj/item/organ/brain
|
||||
|
||||
for(var/obj/item/organ/internal/I in internal_organs)
|
||||
I.Insert(src)
|
||||
|
||||
// for spawned humans; overwritten by other code
|
||||
ready_dna(src)
|
||||
randomize_human(src)
|
||||
|
||||
@@ -172,7 +172,7 @@
|
||||
if(blocked <= 0) return 0
|
||||
|
||||
var/obj/item/organ/limb/organ = null
|
||||
if(isorgan(def_zone))
|
||||
if(islimb(def_zone))
|
||||
organ = def_zone
|
||||
else
|
||||
if(!def_zone) def_zone = ran_zone(def_zone)
|
||||
|
||||
@@ -11,7 +11,7 @@ emp_act
|
||||
var/organnum = 0
|
||||
|
||||
if(def_zone)
|
||||
if(isorgan(def_zone))
|
||||
if(islimb(def_zone))
|
||||
return checkarmor(def_zone, type)
|
||||
var/obj/item/organ/limb/affecting = get_organ(ran_zone(def_zone))
|
||||
return checkarmor(affecting, type)
|
||||
@@ -190,7 +190,6 @@ emp_act
|
||||
apply_effect(20, PARALYZE, armor)
|
||||
if(prob(I.force + min(100,100 - src.health)) && src != user && I.damtype == BRUTE)
|
||||
ticker.mode.remove_revolutionary(mind)
|
||||
ticker.mode.remove_gangster(mind)
|
||||
if(bloody) //Apply blood
|
||||
if(wear_mask)
|
||||
wear_mask.add_blood(src)
|
||||
@@ -469,4 +468,4 @@ emp_act
|
||||
L.take_damage(I.w_class*I.embedded_impact_pain_multiplier)
|
||||
visible_message("<span class='danger'>\the [I.name] embeds itself in [src]'s [L.getDisplayName()]!</span>","<span class='userdanger'>\the [I.name] embeds itself in your [L.getDisplayName()]!</span>")
|
||||
return
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
///checkeyeprot()
|
||||
///Returns a number between -1 to 2
|
||||
/mob/living/carbon/human/check_eye_prot()
|
||||
var/number = 0
|
||||
var/number = ..()
|
||||
if(istype(src.head, /obj/item/clothing/head)) //are they wearing something on their head
|
||||
var/obj/item/clothing/head/HFP = src.head //if yes gets the flash protection value from that item
|
||||
number += HFP.flash_protect
|
||||
@@ -90,9 +90,6 @@
|
||||
if(istype(src.wear_mask, /obj/item/clothing/mask)) //mask
|
||||
var/obj/item/clothing/mask/MFP = src.wear_mask
|
||||
number += MFP.flash_protect
|
||||
var/obj/item/cybernetic_implant/eyes/EFP = locate() in src
|
||||
if(EFP)
|
||||
number += EFP.flash_protect
|
||||
return number
|
||||
|
||||
/mob/living/carbon/human/check_ear_prot()
|
||||
|
||||
@@ -707,6 +707,7 @@
|
||||
switch(H.hal_screwyhud)
|
||||
if(1) H.healths.icon_state = "health6"
|
||||
if(2) H.healths.icon_state = "health7"
|
||||
if(5) H.healths.icon_state = "health0"
|
||||
else
|
||||
switch(H.health - H.staminaloss)
|
||||
if(100 to INFINITY) H.healths.icon_state = "health0"
|
||||
@@ -737,6 +738,8 @@
|
||||
icon_num = 4
|
||||
if(damage > (comparison*4))
|
||||
icon_num = 5
|
||||
if(H.hal_screwyhud == 5)
|
||||
icon_num = 0
|
||||
if(icon_num)
|
||||
H.healthdoll.overlays += image('icons/mob/screen_gen.dmi',"[L.name][icon_num]")
|
||||
|
||||
@@ -1037,7 +1040,6 @@
|
||||
H.apply_effect(20, PARALYZE, armor)
|
||||
if(prob(I.force + ((100 - H.health)/2)) && H != user && I.damtype == BRUTE)
|
||||
ticker.mode.remove_revolutionary(H.mind)
|
||||
ticker.mode.remove_gangster(H.mind)
|
||||
|
||||
if(bloody) //Apply blood
|
||||
if(H.wear_mask)
|
||||
@@ -1098,7 +1100,7 @@
|
||||
if(blocked <= 0) return 0
|
||||
|
||||
var/obj/item/organ/limb/organ = null
|
||||
if(isorgan(def_zone))
|
||||
if(islimb(def_zone))
|
||||
organ = def_zone
|
||||
else
|
||||
if(!def_zone) def_zone = ran_zone(def_zone)
|
||||
|
||||
@@ -212,13 +212,18 @@ Please contact me on #coderbus IRC. ~Carnie x
|
||||
var/image/standing
|
||||
|
||||
var/iconfile2use //Which icon file to use to generate the overlay and any female alterations.
|
||||
var/layer2use
|
||||
|
||||
if(U.alternate_worn_icon)
|
||||
iconfile2use = U.alternate_worn_icon
|
||||
if(!iconfile2use)
|
||||
iconfile2use = 'icons/mob/uniform.dmi'
|
||||
if(U.alternate_worn_layer)
|
||||
layer2use = U.alternate_worn_layer
|
||||
if(!layer2use)
|
||||
layer2use = UNIFORM_LAYER
|
||||
|
||||
standing = image("icon"=iconfile2use, "icon_state"="[t_color]_s", "layer"=-UNIFORM_LAYER)
|
||||
standing = image("icon"=iconfile2use, "icon_state"="[t_color]_s", "layer"=-layer2use)
|
||||
|
||||
overlays_standing[UNIFORM_LAYER] = standing
|
||||
|
||||
@@ -266,11 +271,17 @@ Please contact me on #coderbus IRC. ~Carnie x
|
||||
var/t_state = gloves.item_state
|
||||
if(!t_state) t_state = gloves.icon_state
|
||||
|
||||
var/layer2use
|
||||
if(gloves.alternate_worn_layer)
|
||||
layer2use = gloves.alternate_worn_layer
|
||||
if(!layer2use)
|
||||
layer2use = GLOVES_LAYER
|
||||
|
||||
var/image/standing
|
||||
if(gloves.alternate_worn_icon)
|
||||
standing = image("icon"=gloves.alternate_worn_icon, "icon_state"="[t_state]", "layer"=-GLOVES_LAYER)
|
||||
standing = image("icon"=gloves.alternate_worn_icon, "icon_state"="[t_state]", "layer"=-layer2use)
|
||||
if(!standing)
|
||||
standing = image("icon"='icons/mob/hands.dmi', "icon_state"="[t_state]", "layer"=-GLOVES_LAYER)
|
||||
standing = image("icon"='icons/mob/hands.dmi', "icon_state"="[t_state]", "layer"=-layer2use)
|
||||
|
||||
overlays_standing[GLOVES_LAYER] = standing
|
||||
|
||||
@@ -294,11 +305,17 @@ Please contact me on #coderbus IRC. ~Carnie x
|
||||
glasses.screen_loc = ui_glasses //...draw the item in the inventory screen
|
||||
client.screen += glasses //Either way, add the item to the HUD
|
||||
|
||||
var/layer2use
|
||||
if(glasses.alternate_worn_layer)
|
||||
layer2use = glasses.alternate_worn_layer
|
||||
if(!layer2use)
|
||||
layer2use = GLASSES_LAYER
|
||||
|
||||
var/image/standing
|
||||
if(glasses.alternate_worn_icon)
|
||||
standing = image("icon"=glasses.alternate_worn_icon, "icon_state"="[glasses.icon_state]","layer"=-GLASSES_LAYER)
|
||||
standing = image("icon"=glasses.alternate_worn_icon, "icon_state"="[glasses.icon_state]","layer"=-layer2use)
|
||||
if(!standing)
|
||||
standing = image("icon"='icons/mob/eyes.dmi', "icon_state"="[glasses.icon_state]", "layer"=-GLASSES_LAYER)
|
||||
standing = image("icon"='icons/mob/eyes.dmi', "icon_state"="[glasses.icon_state]", "layer"=-layer2use)
|
||||
|
||||
overlays_standing[GLASSES_LAYER] = standing
|
||||
|
||||
@@ -314,11 +331,17 @@ Please contact me on #coderbus IRC. ~Carnie x
|
||||
ears.screen_loc = ui_ears //...draw the item in the inventory screen
|
||||
client.screen += ears //Either way, add the item to the HUD
|
||||
|
||||
var/layer2use
|
||||
if(ears.alternate_worn_layer)
|
||||
layer2use = ears.alternate_worn_layer
|
||||
if(!layer2use)
|
||||
layer2use = EARS_LAYER
|
||||
|
||||
var/image/standing
|
||||
if(ears.alternate_worn_icon)
|
||||
standing = image("icon"=ears.alternate_worn_icon, "icon_state"="[ears.icon_state]", "layer"=-EARS_LAYER)
|
||||
standing = image("icon"=ears.alternate_worn_icon, "icon_state"="[ears.icon_state]", "layer"=-layer2use)
|
||||
if(!standing)
|
||||
standing = image("icon"='icons/mob/ears.dmi', "icon_state"="[ears.icon_state]", "layer"=-EARS_LAYER)
|
||||
standing = image("icon"='icons/mob/ears.dmi', "icon_state"="[ears.icon_state]", "layer"=-layer2use)
|
||||
|
||||
overlays_standing[EARS_LAYER] = standing
|
||||
|
||||
@@ -334,11 +357,17 @@ Please contact me on #coderbus IRC. ~Carnie x
|
||||
shoes.screen_loc = ui_shoes //...draw the item in the inventory screen
|
||||
client.screen += shoes //Either way, add the item to the HUD
|
||||
|
||||
var/layer2use
|
||||
if(shoes.alternate_worn_layer)
|
||||
layer2use = shoes.alternate_worn_layer
|
||||
if(!layer2use)
|
||||
layer2use = SHOES_LAYER
|
||||
|
||||
var/image/standing
|
||||
if(shoes.alternate_worn_icon)
|
||||
standing = image("icon"=shoes.alternate_worn_icon, "icon_state"="[shoes.icon_state]","layer"=-SHOES_LAYER)
|
||||
standing = image("icon"=shoes.alternate_worn_icon, "icon_state"="[shoes.icon_state]","layer"=-layer2use)
|
||||
if(!standing)
|
||||
standing = image("icon"='icons/mob/feet.dmi', "icon_state"="[shoes.icon_state]", "layer"=-SHOES_LAYER)
|
||||
standing = image("icon"='icons/mob/feet.dmi', "icon_state"="[shoes.icon_state]", "layer"=-layer2use)
|
||||
overlays_standing[SHOES_LAYER] = standing
|
||||
|
||||
if(shoes.blood_DNA)
|
||||
@@ -384,11 +413,17 @@ Please contact me on #coderbus IRC. ~Carnie x
|
||||
var/t_state = belt.item_state
|
||||
if(!t_state) t_state = belt.icon_state
|
||||
|
||||
var/layer2use
|
||||
if(belt.alternate_worn_layer)
|
||||
layer2use = belt.alternate_worn_layer
|
||||
if(!layer2use)
|
||||
layer2use = BELT_LAYER
|
||||
|
||||
var/image/standing
|
||||
if(belt.alternate_worn_icon)
|
||||
standing = image("icon"=belt.alternate_worn_icon, "icon_state"="[t_state]", "layer"=-BELT_LAYER)
|
||||
standing = image("icon"=belt.alternate_worn_icon, "icon_state"="[t_state]", "layer"=-layer2use)
|
||||
if(!standing)
|
||||
standing = image("icon"='icons/mob/belt.dmi', "icon_state"="[t_state]", "layer"=-BELT_LAYER)
|
||||
standing = image("icon"='icons/mob/belt.dmi', "icon_state"="[t_state]", "layer"=-layer2use)
|
||||
|
||||
overlays_standing[BELT_LAYER] = standing
|
||||
|
||||
@@ -405,11 +440,18 @@ Please contact me on #coderbus IRC. ~Carnie x
|
||||
wear_suit.screen_loc = ui_oclothing //TODO //...draw the item in the inventory screen
|
||||
client.screen += wear_suit //Either way, add the item to the HUD
|
||||
|
||||
|
||||
var/layer2use
|
||||
if(wear_suit.alternate_worn_layer)
|
||||
layer2use = wear_suit.alternate_worn_layer
|
||||
if(!layer2use)
|
||||
layer2use = SUIT_LAYER
|
||||
|
||||
var/image/standing
|
||||
if(wear_suit.alternate_worn_icon)
|
||||
standing = image("icon"=wear_suit.alternate_worn_icon, "icon_state"="[wear_suit.icon_state]", "layer"=-SUIT_LAYER)
|
||||
standing = image("icon"=wear_suit.alternate_worn_icon, "icon_state"="[wear_suit.icon_state]", "layer"=-layer2use)
|
||||
if(!standing)
|
||||
standing = image("icon"='icons/mob/suit.dmi', "icon_state"="[wear_suit.icon_state]", "layer"=-SUIT_LAYER)
|
||||
standing = image("icon"='icons/mob/suit.dmi', "icon_state"="[wear_suit.icon_state]", "layer"=-layer2use)
|
||||
overlays_standing[SUIT_LAYER] = standing
|
||||
|
||||
if(istype(wear_suit, /obj/item/clothing/suit/straight_jacket))
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
|
||||
if(..())
|
||||
. = 1
|
||||
for(var/obj/item/organ/internal/O in internal_organs)
|
||||
O.on_life()
|
||||
|
||||
//Updates the number of stored chemicals for powers
|
||||
handle_changeling()
|
||||
@@ -456,7 +458,6 @@
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/update_sight()
|
||||
|
||||
if(stat == DEAD)
|
||||
sight |= SEE_TURFS
|
||||
sight |= SEE_MOBS
|
||||
@@ -521,3 +522,8 @@
|
||||
//We totally need a sweat system cause it totally makes sense...~
|
||||
bodytemperature += min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) //We're dealing with negative numbers
|
||||
|
||||
|
||||
/mob/living/carbon/handle_actions()
|
||||
..()
|
||||
for(var/obj/item/I in internal_organs)
|
||||
give_action_button(I, 1)
|
||||
@@ -6,19 +6,17 @@
|
||||
param = copytext(act, t1 + 1, length(act) + 1)
|
||||
act = copytext(act, 1, t1)
|
||||
|
||||
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
|
||||
act = copytext(act,1,length(act))
|
||||
|
||||
var/muzzled = is_muzzled()
|
||||
var/m_type = 1
|
||||
var/message
|
||||
|
||||
switch(act) //Ooh ooh ah ah keep this alphabetical ooh ooh ah ah!
|
||||
if ("deathgasp")
|
||||
if ("deathgasp","deathgasps")
|
||||
message = "<b>[src]</b> lets out a faint chimper as it collapses and stops moving..."
|
||||
m_type = 1
|
||||
|
||||
if ("gnarl")
|
||||
if ("gnarl","gnarls")
|
||||
if (!muzzled)
|
||||
message = "<B>[src]</B> gnarls and shows its teeth.."
|
||||
m_type = 2
|
||||
@@ -28,35 +26,35 @@
|
||||
message = "<B>[src]</B> flails its paw."
|
||||
m_type = 1
|
||||
|
||||
if ("moan")
|
||||
if ("moan","moans")
|
||||
message = "<B>[src]</B> moans!"
|
||||
m_type = 2
|
||||
|
||||
if ("roar")
|
||||
if ("roar","roars")
|
||||
if (!muzzled)
|
||||
message = "<B>[src]</B> roars."
|
||||
m_type = 2
|
||||
|
||||
if ("roll")
|
||||
if ("roll","rolls")
|
||||
if (!src.restrained())
|
||||
message = "<B>[src]</B> rolls."
|
||||
m_type = 1
|
||||
|
||||
if ("scratch")
|
||||
if ("scratch","scratches")
|
||||
if (!src.restrained())
|
||||
message = "<B>[src]</B> scratches."
|
||||
m_type = 1
|
||||
|
||||
if ("scretch")
|
||||
if ("screech","screeches")
|
||||
if (!muzzled)
|
||||
message = "<B>[src]</B> scretches."
|
||||
message = "<B>[src]</B> screeches."
|
||||
m_type = 2
|
||||
|
||||
if ("shiver")
|
||||
if ("shiver","shivers")
|
||||
message = "<B>[src]</B> shivers."
|
||||
m_type = 2
|
||||
|
||||
if ("sign")
|
||||
if ("sign","signs")
|
||||
if (!src.restrained())
|
||||
message = text("<B>[src]</B> signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null))
|
||||
m_type = 1
|
||||
@@ -66,7 +64,7 @@
|
||||
m_type = 1
|
||||
|
||||
if ("help") //Ooh ah ooh ooh this is an exception to alphabetical ooh ooh.
|
||||
src << "Help for monkey emotes. You can use these emotes with say \"*emote\":\n\naflap, airguitar, blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, dance, deathgasp, drool, flap, frown, gasp, gnarl, giggle, glare-(none)/mob, grin, jump, laugh, look, me, moan, nod, paw, point-(atom), roar, roll, scream, scratch, scretch, shake, shiver, sigh, sign-#, sit, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tail, tremble, twitch, twitch_s, wave whimper, wink, yawn"
|
||||
src << "Help for monkey emotes. You can use these emotes with say \"*emote\":\n\naflap, airguitar, blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, dance, deathgasp, drool, flap, frown, gasp, gnarl, giggle, glare-(none)/mob, grin, jump, laugh, look, me, moan, nod, paw, point-(atom), roar, roll, scream, scratch, screech, shake, shiver, sigh, sign-#, sit, smile, sneeze, sniff, snore, stare-(none)/mob, sulk, sway, tail, tremble, twitch, twitch_s, wave whimper, wink, yawn"
|
||||
|
||||
else
|
||||
..(act)
|
||||
|
||||
@@ -143,7 +143,7 @@
|
||||
/mob/living/carbon/monkey/handle_changeling()
|
||||
if(mind && hud_used)
|
||||
if(mind.changeling)
|
||||
mind.changeling.regenerate()
|
||||
mind.changeling.regenerate(src)
|
||||
hud_used.lingchemdisplay.invisibility = 0
|
||||
hud_used.lingchemdisplay.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='#dd66dd'>[round(mind.changeling.chem_charges)]</font></div>"
|
||||
else
|
||||
|
||||
@@ -16,10 +16,13 @@
|
||||
verbs += /mob/living/proc/mob_sleep
|
||||
verbs += /mob/living/proc/lay_down
|
||||
|
||||
internal_organs += new /obj/item/organ/appendix
|
||||
internal_organs += new /obj/item/organ/heart
|
||||
internal_organs += new /obj/item/organ/internal/appendix
|
||||
internal_organs += new /obj/item/organ/internal/heart
|
||||
internal_organs += new /obj/item/organ/brain
|
||||
|
||||
for(var/obj/item/organ/internal/I in internal_organs)
|
||||
I.Insert(src)
|
||||
|
||||
if(name == "monkey")
|
||||
name = text("monkey ([rand(1, 1000)])")
|
||||
real_name = name
|
||||
@@ -272,4 +275,11 @@
|
||||
if(wear_mask)
|
||||
protection = max(1 - wear_mask.permeability_coefficient, protection)
|
||||
protection = protection/7 //the rest of the body isn't covered.
|
||||
return protection
|
||||
return protection
|
||||
|
||||
/mob/living/carbon/monkey/check_eye_prot()
|
||||
var/number = ..()
|
||||
if(istype(src.wear_mask, /obj/item/clothing/mask))
|
||||
var/obj/item/clothing/mask/MFP = src.wear_mask
|
||||
number += MFP.flash_protect
|
||||
return number
|
||||
@@ -96,11 +96,18 @@
|
||||
/mob/living/carbon/update_inv_wear_mask()
|
||||
remove_overlay(FACEMASK_LAYER)
|
||||
if(istype(wear_mask, /obj/item/clothing/mask))
|
||||
|
||||
var/layer2use
|
||||
if(wear_mask.alternate_worn_layer)
|
||||
layer2use = wear_mask.alternate_worn_layer
|
||||
if(!layer2use)
|
||||
layer2use = FACEMASK_LAYER
|
||||
|
||||
var/image/standing
|
||||
if(wear_mask.alternate_worn_icon)
|
||||
standing = image("icon"=wear_mask.alternate_worn_icon, "icon_state"="[wear_mask.icon_state]", "layer"=-FACEMASK_LAYER)
|
||||
standing = image("icon"=wear_mask.alternate_worn_icon, "icon_state"="[wear_mask.icon_state]", "layer"=-layer2use)
|
||||
if(!standing)
|
||||
standing = image("icon"='icons/mob/mask.dmi', "icon_state"="[wear_mask.icon_state]", "layer"=-FACEMASK_LAYER)
|
||||
standing = image("icon"='icons/mob/mask.dmi', "icon_state"="[wear_mask.icon_state]", "layer"=-layer2use)
|
||||
|
||||
overlays_standing[FACEMASK_LAYER] = standing
|
||||
|
||||
@@ -111,11 +118,18 @@
|
||||
/mob/living/carbon/update_inv_back()
|
||||
remove_overlay(BACK_LAYER)
|
||||
if(back)
|
||||
|
||||
var/layer2use
|
||||
if(back.alternate_worn_layer)
|
||||
layer2use = back.alternate_worn_layer
|
||||
if(!layer2use)
|
||||
layer2use = BACK_LAYER
|
||||
|
||||
var/image/standing
|
||||
if(back.alternate_worn_icon)
|
||||
standing = image("icon"=back.alternate_worn_icon, "icon_state"="[back.icon_state]", "layer"=-BACK_LAYER)
|
||||
standing = image("icon"=back.alternate_worn_icon, "icon_state"="[back.icon_state]", "layer"=-layer2use)
|
||||
if(!standing)
|
||||
standing = image("icon"='icons/mob/back.dmi', "icon_state"="[back.icon_state]", "layer"=-BACK_LAYER)
|
||||
standing = image("icon"='icons/mob/back.dmi', "icon_state"="[back.icon_state]", "layer"=-layer2use)
|
||||
|
||||
overlays_standing[BACK_LAYER] = standing
|
||||
return back
|
||||
@@ -124,11 +138,18 @@
|
||||
/mob/living/carbon/update_inv_head()
|
||||
remove_overlay(HEAD_LAYER)
|
||||
if(head)
|
||||
|
||||
var/layer2use
|
||||
if(head.alternate_worn_layer)
|
||||
layer2use = head.alternate_worn_layer
|
||||
if(!layer2use)
|
||||
layer2use = HEAD_LAYER
|
||||
|
||||
var/image/standing
|
||||
if(head.alternate_worn_icon)
|
||||
standing = image("icon"=head.alternate_worn_icon, "icon_state"="[head.icon_state]", "layer"=-HEAD_LAYER)
|
||||
standing = image("icon"=head.alternate_worn_icon, "icon_state"="[head.icon_state]", "layer"=-layer2use)
|
||||
if(!standing)
|
||||
standing = image("icon"='icons/mob/head.dmi', "icon_state"="[head.icon_state]", "layer"=-HEAD_LAYER)
|
||||
standing = image("icon"='icons/mob/head.dmi', "icon_state"="[head.icon_state]", "layer"=-layer2use)
|
||||
standing.color = head.color // For now, this is here solely for kitty ears, but everything should do this eventually
|
||||
standing.alpha = head.alpha
|
||||
|
||||
|
||||
@@ -8,25 +8,22 @@
|
||||
|
||||
var/param = null
|
||||
|
||||
if (findtext(act, "-", 1, null))
|
||||
if (findtext(act, "-", 1, null)) //Removes dashes for npcs "EMOTE-PLAYERNAME" or something like that, I ain't no AI coder. It's not for players. -Sum99
|
||||
var/t1 = findtext(act, "-", 1, null)
|
||||
param = copytext(act, t1 + 1, length(act) + 1)
|
||||
act = copytext(act, 1, t1)
|
||||
|
||||
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
|
||||
act = copytext(act,1,length(act))
|
||||
|
||||
switch(act)//Hello, how would you like to order? Alphabetically!
|
||||
if ("aflap")
|
||||
if (!src.restrained())
|
||||
message = "<B>[src]</B> flaps its wings ANGRILY!"
|
||||
m_type = 2
|
||||
|
||||
if ("blush")
|
||||
if ("blush","blushes")
|
||||
message = "<B>[src]</B> blushes."
|
||||
m_type = 1
|
||||
|
||||
if ("bow")
|
||||
if ("bow","bows")
|
||||
if (!src.buckled)
|
||||
var/M = null
|
||||
if (param)
|
||||
@@ -42,70 +39,70 @@
|
||||
message = "<B>[src]</B> bows."
|
||||
m_type = 1
|
||||
|
||||
if ("burp")
|
||||
if ("burp","burps")
|
||||
message = "<B>[src]</B> burps."
|
||||
m_type = 2
|
||||
|
||||
if ("choke")
|
||||
if ("choke","chokes")
|
||||
message = "<B>[src]</B> chokes!"
|
||||
m_type = 2
|
||||
|
||||
if ("chuckle")
|
||||
if ("chuckle","chuckles")
|
||||
message = "<B>[src]</B> chuckles."
|
||||
m_type = 2
|
||||
|
||||
if ("collapse")
|
||||
if ("collapse","collapses")
|
||||
Paralyse(2)
|
||||
message = "<B>[src]</B> collapses!"
|
||||
m_type = 2
|
||||
|
||||
if ("cough")
|
||||
if ("cough","coughs")
|
||||
message = "<B>[src]</B> coughs!"
|
||||
m_type = 2
|
||||
|
||||
if ("dance")
|
||||
if ("dance","dances")
|
||||
if (!src.restrained())
|
||||
message = "<B>[src]</B> dances around happily."
|
||||
m_type = 1
|
||||
|
||||
if ("deathgasp")
|
||||
if ("deathgasp","deathgasps")
|
||||
message = "<B>[src]</B> seizes up and falls limp, its eyes dead and lifeless..."
|
||||
m_type = 1
|
||||
|
||||
if ("drool")
|
||||
if ("drool","drools")
|
||||
message = "<B>[src]</B> drools."
|
||||
m_type = 1
|
||||
|
||||
if ("faint")
|
||||
if ("faint","faints")
|
||||
message = "<B>[src]</B> faints."
|
||||
if(src.sleeping)
|
||||
return //Can't faint while asleep
|
||||
src.sleeping += 10 //Short-short nap
|
||||
m_type = 1
|
||||
|
||||
if ("flap")
|
||||
if ("flap","flaps")
|
||||
if (!src.restrained())
|
||||
message = "<B>[src]</B> flaps its wings."
|
||||
m_type = 2
|
||||
|
||||
if ("flip")
|
||||
if ("flip","flips")
|
||||
if (!src.restrained() || !src.resting || !src.sleeping)
|
||||
src.SpinAnimation(7,1)
|
||||
m_type = 2
|
||||
|
||||
if ("frown")
|
||||
if ("frown","frowns")
|
||||
message = "<B>[src]</B> frowns."
|
||||
m_type = 1
|
||||
|
||||
if ("gasp")
|
||||
if ("gasp","gasps")
|
||||
message = "<B>[src]</B> gasps!"
|
||||
m_type = 2
|
||||
|
||||
if ("giggle")
|
||||
if ("giggle","giggles")
|
||||
message = "<B>[src]</B> giggles."
|
||||
m_type = 2
|
||||
|
||||
if ("glare")
|
||||
if ("glare","glares")
|
||||
var/M = null
|
||||
if (param)
|
||||
for (var/mob/A in view(1, src))
|
||||
@@ -119,19 +116,19 @@
|
||||
else
|
||||
message = "<B>[src]</B> glares."
|
||||
|
||||
if ("grin")
|
||||
if ("grin","grins")
|
||||
message = "<B>[src]</B> grins."
|
||||
m_type = 1
|
||||
|
||||
if ("jump")
|
||||
if ("jump","jumps")
|
||||
message = "<B>[src]</B> jumps!"
|
||||
m_type = 1
|
||||
|
||||
if ("laugh")
|
||||
if ("laugh","laughs")
|
||||
message = "<B>[src]</B> laughs."
|
||||
m_type = 2
|
||||
|
||||
if ("look")
|
||||
if ("look","looks")
|
||||
var/M = null
|
||||
if (param)
|
||||
for (var/mob/A in view(1, src))
|
||||
@@ -158,11 +155,11 @@
|
||||
else
|
||||
message = "<B>[src]</B> [message]"
|
||||
|
||||
if ("nod")
|
||||
if ("nod","nods")
|
||||
message = "<B>[src]</B> nods."
|
||||
m_type = 1
|
||||
|
||||
if ("point")
|
||||
if ("point","points")
|
||||
if (!src.restrained())
|
||||
var/atom/M = null
|
||||
if (param)
|
||||
@@ -176,39 +173,39 @@
|
||||
pointed(M)
|
||||
m_type = 1
|
||||
|
||||
if ("scream")
|
||||
if ("scream","screams")
|
||||
message = "<B>[src]</B> screams!"
|
||||
m_type = 2
|
||||
|
||||
if ("shake")
|
||||
if ("shake","shakes")
|
||||
message = "<B>[src]</B> shakes its head."
|
||||
m_type = 1
|
||||
|
||||
if ("sigh")
|
||||
if ("sigh","sighs")
|
||||
message = "<B>[src]</B> sighs."
|
||||
m_type = 2
|
||||
|
||||
if ("sit")
|
||||
if ("sit","sits")
|
||||
message = "<B>[src]</B> sits down."
|
||||
m_type = 1
|
||||
|
||||
if ("smile")
|
||||
if ("smile","smiles")
|
||||
message = "<B>[src]</B> smiles."
|
||||
m_type = 1
|
||||
|
||||
if ("sneeze")
|
||||
if ("sneeze","sneezes")
|
||||
message = "<B>[src]</B> sneezes."
|
||||
m_type = 2
|
||||
|
||||
if ("sniff")
|
||||
if ("sniff","sniffs")
|
||||
message = "<B>[src]</B> sniffs."
|
||||
m_type = 2
|
||||
|
||||
if ("snore")
|
||||
if ("snore","snores")
|
||||
message = "<B>[src]</B> snores."
|
||||
m_type = 2
|
||||
|
||||
if ("stare")
|
||||
if ("stare","stares")
|
||||
var/M = null
|
||||
if (param)
|
||||
for (var/mob/A in view(1, src))
|
||||
@@ -222,19 +219,19 @@
|
||||
else
|
||||
message = "<B>[src]</B> stares."
|
||||
|
||||
if ("sulk")
|
||||
if ("sulk","sulks")
|
||||
message = "<B>[src]</B> sulks down sadly."
|
||||
m_type = 1
|
||||
|
||||
if ("sway")
|
||||
if ("sway","sways")
|
||||
message = "<B>[src]</B> sways around dizzily."
|
||||
m_type = 1
|
||||
|
||||
if ("tremble")
|
||||
if ("tremble","trembles")
|
||||
message = "<B>[src]</B> trembles in fear!"
|
||||
m_type = 1
|
||||
|
||||
if ("twitch")
|
||||
if ("twitch","twitches")
|
||||
message = "<B>[src]</B> twitches violently."
|
||||
m_type = 1
|
||||
|
||||
@@ -242,15 +239,15 @@
|
||||
message = "<B>[src]</B> twitches."
|
||||
m_type = 1
|
||||
|
||||
if ("wave")
|
||||
if ("wave","waves")
|
||||
message = "<B>[src]</B> waves."
|
||||
m_type = 1
|
||||
|
||||
if ("whimper")
|
||||
if ("whimper","whimpers")
|
||||
message = "<B>[src]</B> whimpers."
|
||||
m_type = 2
|
||||
|
||||
if ("yawn")
|
||||
if ("yawn","yawns")
|
||||
message = "<B>[src]</B> yawns."
|
||||
m_type = 2
|
||||
|
||||
|
||||
@@ -138,27 +138,27 @@
|
||||
if(A.CheckRemoval(src))
|
||||
A.Remove(src)
|
||||
for(var/obj/item/I in src)
|
||||
if(I.action_button_name)
|
||||
if(!I.action)
|
||||
if(I.action_button_is_hands_free)
|
||||
I.action = new/datum/action/item_action/hands_free
|
||||
else
|
||||
I.action = new/datum/action/item_action
|
||||
I.action.name = I.action_button_name
|
||||
I.action.target = I
|
||||
I.action.Grant(src)
|
||||
for(var/obj/item/T in I)
|
||||
if(T.action_button_name && T.action_button_internal)
|
||||
if(!T.action)
|
||||
if(T.action_button_is_hands_free)
|
||||
T.action = new/datum/action/item_action/hands_free
|
||||
else
|
||||
T.action = new/datum/action/item_action
|
||||
T.action.name = T.action_button_name
|
||||
T.action.target = T
|
||||
T.action.Grant(src)
|
||||
give_action_button(I, 1)
|
||||
return
|
||||
|
||||
/mob/living/proc/give_action_button(var/obj/item/I, recursive = 0)
|
||||
if(I.action_button_name)
|
||||
if(!I.action)
|
||||
if(istype(I, /obj/item/organ/internal))
|
||||
I.action = new/datum/action/organ_action
|
||||
else if(I.action_button_is_hands_free)
|
||||
I.action = new/datum/action/item_action/hands_free
|
||||
else
|
||||
I.action = new/datum/action/item_action
|
||||
I.action.name = I.action_button_name
|
||||
I.action.target = I
|
||||
I.action.Grant(src)
|
||||
|
||||
if(recursive)
|
||||
for(var/obj/item/T in I)
|
||||
give_action_button(I, recursive - 1)
|
||||
|
||||
|
||||
//this handles hud updates. Calls update_vision() and handle_hud_icons()
|
||||
/mob/living/proc/handle_regular_hud_updates()
|
||||
if(!client) return 0
|
||||
|
||||
@@ -99,22 +99,23 @@ Sorry Giacom. Please don't be mad :(
|
||||
if(loc && !loc.Adjacent(M.loc))
|
||||
return 1
|
||||
now_pushing = 1
|
||||
//TODO: Make this use Move(). we're pretty much recreating it here.
|
||||
//it could be done by setting one of the locs to null to make Move() work, then setting it back and Move() the other mob
|
||||
var/oldloc = loc
|
||||
loc = M.loc
|
||||
M.loc = oldloc
|
||||
M.LAssailant = src
|
||||
var/oldMloc = M.loc
|
||||
|
||||
for(var/mob/living/simple_animal/slime/slime in view(1,M))
|
||||
if(slime.Victim == M)
|
||||
slime.UpdateFeed()
|
||||
|
||||
//cross any movable atoms on either turf
|
||||
for(var/atom/movable/AM in loc)
|
||||
AM.Crossed(src)
|
||||
for(var/atom/movable/AM in oldloc)
|
||||
AM.Crossed(M)
|
||||
var/M_passmob = (M.pass_flags & PASSMOB) // we give PASSMOB to both mobs to avoid bumping other mobs during swap.
|
||||
var/src_passmob = (pass_flags & PASSMOB)
|
||||
M.pass_flags |= PASSMOB
|
||||
pass_flags |= PASSMOB
|
||||
|
||||
M.Move(oldloc)
|
||||
Move(oldMloc)
|
||||
|
||||
if(!src_passmob)
|
||||
pass_flags &= ~PASSMOB
|
||||
if(!M_passmob)
|
||||
M.pass_flags &= ~PASSMOB
|
||||
|
||||
now_pushing = 0
|
||||
return 1
|
||||
|
||||
@@ -569,7 +570,8 @@ Sorry Giacom. Please don't be mad :(
|
||||
else
|
||||
stop_pulling()
|
||||
. = ..()
|
||||
if ((s_active && !( s_active in contents ) ))
|
||||
if (s_active && !(s_active in contents) && !(s_active.loc in contents))
|
||||
// It's ugly. But everything related to inventory/storage is. -- c0
|
||||
s_active.close(src)
|
||||
|
||||
for(var/mob/living/simple_animal/slime/M in oview(1,src))
|
||||
|
||||
@@ -44,12 +44,6 @@
|
||||
else
|
||||
return 0
|
||||
|
||||
/mob/living/throw_impact(atom/hit_atom)
|
||||
. = ..()
|
||||
if(hit_atom.density)
|
||||
Weaken(1)
|
||||
take_organ_damage(10)
|
||||
|
||||
/mob/living/hitby(atom/movable/AM)
|
||||
if(istype(AM, /obj/item))
|
||||
var/obj/item/I = AM
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them.
|
||||
|
||||
var/now_pushing = null
|
||||
var/now_pushing = null //used by living/Bump() and living/PushAM() to prevent potential infinite loop.
|
||||
|
||||
var/cameraFollow = null
|
||||
|
||||
@@ -34,6 +34,8 @@
|
||||
var/on_fire = 0 //The "Are we on fire?" var
|
||||
var/fire_stacks = 0 //Tracks how many stacks of fire we have on, max is usually 20
|
||||
|
||||
var/bloodcrawl = 0 //0 No blood crawling, BLOODCRAWL for bloodcrawling, BLOODCRAWL_EAT for crawling+mob devour
|
||||
var/holder = null //The holder for blood crawling
|
||||
var/ventcrawler = 0 //0 No vent crawling, 1 vent crawling in the nude, 2 vent crawling always
|
||||
var/floating = 0
|
||||
var/mob_size = MOB_SIZE_HUMAN
|
||||
|
||||
@@ -90,7 +90,8 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN)
|
||||
src << "<span class='warning'>You find yourself unable to speak!</span>"
|
||||
return
|
||||
|
||||
message = treat_message(message)
|
||||
if(message_mode != MODE_WHISPER) //whisper() calls treat_message(); double process results in "hisspering"
|
||||
message = treat_message(message)
|
||||
var/spans = list()
|
||||
spans += get_spans()
|
||||
|
||||
|
||||
@@ -5,8 +5,6 @@
|
||||
param = copytext(act, t1 + 1, length(act) + 1)
|
||||
act = copytext(act, 1, t1)
|
||||
|
||||
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
|
||||
act = copytext(act,1,length(act))
|
||||
|
||||
switch(act)//01000001011011000111000001101000011000010110001001100101011101000110100101111010011001010110010000100001 (Seriously please keep it that way.)
|
||||
if ("aflap")
|
||||
@@ -15,7 +13,7 @@
|
||||
m_type = 2
|
||||
m_type = 1
|
||||
|
||||
if("beep")
|
||||
if("beep","beeps")
|
||||
var/M = null
|
||||
if(param)
|
||||
for (var/mob/A in view(1, src))
|
||||
@@ -32,7 +30,7 @@
|
||||
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
|
||||
m_type = 2
|
||||
|
||||
if ("bow")
|
||||
if ("bow","bows")
|
||||
if (!src.buckled)
|
||||
var/M = null
|
||||
if (param)
|
||||
@@ -70,12 +68,12 @@
|
||||
playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0)
|
||||
m_type = 2
|
||||
|
||||
if ("chime") //You have mail!
|
||||
if ("chime","chimes") //You have mail!
|
||||
message = "<B>[src]</B> chimes."
|
||||
playsound(loc, 'sound/machines/chime.ogg', 50, 0)
|
||||
m_type = 2
|
||||
|
||||
if ("clap")
|
||||
if ("clap","claps")
|
||||
if (!src.restrained())
|
||||
message = "<B>[src]</B> claps."
|
||||
m_type = 2
|
||||
@@ -94,16 +92,16 @@
|
||||
return
|
||||
message = "<B>[src]</B> [input]"
|
||||
|
||||
if ("deathgasp")
|
||||
if ("deathgasp","deathgasps")
|
||||
message = "<B>[src]</B> shudders violently for a moment, then becomes motionless, its eyes slowly darkening."
|
||||
m_type = 1
|
||||
|
||||
if ("flap")
|
||||
if ("flap","flaps")
|
||||
if (!src.restrained())
|
||||
message = "<B>[src]</B> flaps \his wings."
|
||||
m_type = 2
|
||||
|
||||
if ("glare")
|
||||
if ("glare","glares")
|
||||
var/M = null
|
||||
if (param)
|
||||
for (var/mob/A in view(1, src))
|
||||
@@ -117,12 +115,12 @@
|
||||
else
|
||||
message = "<B>[src]</B> glares."
|
||||
|
||||
if ("honk") //Honk!
|
||||
if ("honk","honks") //Honk!
|
||||
message = "<B>[src]</B> honks!"
|
||||
playsound(loc, 'sound/items/bikehorn.ogg', 50, 1)
|
||||
m_type = 2
|
||||
|
||||
if ("look")
|
||||
if ("look","looks")
|
||||
var/M = null
|
||||
if (param)
|
||||
for (var/mob/A in view(1, src))
|
||||
@@ -150,11 +148,11 @@
|
||||
else
|
||||
message = "<B>[src]</B> [message]"
|
||||
|
||||
if ("nod")
|
||||
if ("nod","nods")
|
||||
message = "<B>[src]</B> nods."
|
||||
m_type = 1
|
||||
|
||||
if ("ping")
|
||||
if ("ping","pings")
|
||||
var/M = null
|
||||
if(param)
|
||||
for (var/mob/A in view(1, src))
|
||||
@@ -175,7 +173,7 @@
|
||||
playsound(loc, 'sound/misc/sadtrombone.ogg', 50, 0)
|
||||
m_type = 2
|
||||
|
||||
if ("salute")
|
||||
if ("salute","salutes")
|
||||
if (!src.buckled)
|
||||
var/M = null
|
||||
if (param)
|
||||
@@ -191,7 +189,7 @@
|
||||
else
|
||||
message = "<B>[src]</b> salutes."
|
||||
|
||||
if ("stare")
|
||||
if ("stare","stares")
|
||||
var/M = null
|
||||
if (param)
|
||||
for (var/mob/A in view(1, src))
|
||||
@@ -206,7 +204,7 @@
|
||||
message = "<B>[src]</B> stares."
|
||||
m_type = 1
|
||||
|
||||
if ("twitch")
|
||||
if ("twitch","twitches")
|
||||
message = "<B>[src]</B> twitches violently."
|
||||
m_type = 1
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
/mob/living/silicon/robot/proc/uneq_module(obj/item/O)
|
||||
if(!O)
|
||||
return 0
|
||||
|
||||
O.mouse_opacity = 2
|
||||
if(istype(O,/obj/item/borg/sight))
|
||||
var/obj/item/borg/sight/S = O
|
||||
sight_mode &= ~S.sight_mode
|
||||
@@ -45,6 +45,7 @@
|
||||
src << "<span class='notice'>Already activated</span>"
|
||||
return
|
||||
if(!module_state_1)
|
||||
O.mouse_opacity = initial(O.mouse_opacity)
|
||||
module_state_1 = O
|
||||
O.layer = 20
|
||||
O.screen_loc = inv1.screen_loc
|
||||
@@ -52,6 +53,7 @@
|
||||
if(istype(module_state_1,/obj/item/borg/sight))
|
||||
sight_mode |= module_state_1:sight_mode
|
||||
else if(!module_state_2)
|
||||
O.mouse_opacity = initial(O.mouse_opacity)
|
||||
module_state_2 = O
|
||||
O.layer = 20
|
||||
O.screen_loc = inv2.screen_loc
|
||||
@@ -59,6 +61,7 @@
|
||||
if(istype(module_state_2,/obj/item/borg/sight))
|
||||
sight_mode |= module_state_2:sight_mode
|
||||
else if(!module_state_3)
|
||||
O.mouse_opacity = initial(O.mouse_opacity)
|
||||
module_state_3 = O
|
||||
O.layer = 20
|
||||
O.screen_loc = inv3.screen_loc
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
show_laws(0)
|
||||
if(mind) ticker.mode.remove_revolutionary(mind)
|
||||
if(mind) ticker.mode.remove_gangster(mind,1,remove_bosses=1)
|
||||
if(mind) ticker.mode.remove_thrall(mind,0)
|
||||
|
||||
/mob/living/silicon/robot/update_hotkey_mode()
|
||||
winset(src, null, "mainwindow.macro=borghotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0")
|
||||
|
||||
@@ -63,6 +63,7 @@
|
||||
var/braintype = "Cyborg"
|
||||
var/lamp_max = 10 //Maximum brightness of a borg lamp. Set as a var for easy adjusting.
|
||||
var/lamp_intensity = 0 //Luminosity of the headlamp. 0 is off. Higher settings than the minimum require power.
|
||||
var/lamp_recharging = 0 //Flag for if the lamp is on cooldown after being forcibly disabled.
|
||||
|
||||
/mob/living/silicon/robot/New(loc)
|
||||
spark_system = new /datum/effect/effect/system/spark_spread()
|
||||
@@ -107,7 +108,6 @@
|
||||
mmi = new(src)
|
||||
mmi.brain = new /obj/item/organ/brain(mmi)
|
||||
mmi.brain.name = "[real_name]'s brain"
|
||||
mmi.locked = 1
|
||||
mmi.icon_state = "mmi_full"
|
||||
mmi.name = "Man-Machine Interface: [real_name]"
|
||||
mmi.brainmob = new(src)
|
||||
@@ -990,7 +990,7 @@
|
||||
set_autosay()
|
||||
|
||||
/mob/living/silicon/robot/proc/control_headlamp()
|
||||
if(stat)
|
||||
if(stat || lamp_recharging)
|
||||
src << "<span class='danger'>This function is currently offline.</span>"
|
||||
return
|
||||
|
||||
@@ -999,12 +999,15 @@
|
||||
src << "[lamp_intensity ? "Headlamp power set to Level [lamp_intensity/2]" : "Headlamp disabled."]"
|
||||
update_headlamp()
|
||||
|
||||
/mob/living/silicon/robot/proc/update_headlamp(var/turn_off = 0)
|
||||
/mob/living/silicon/robot/proc/update_headlamp(var/turn_off = 0, var/cooldown = 100)
|
||||
SetLuminosity(0)
|
||||
|
||||
if(lamp_intensity && (turn_off || stat))
|
||||
src << "<span class='danger'>Your headlamp has been deactivated.</span>"
|
||||
lamp_intensity = 0
|
||||
lamp_recharging = 1
|
||||
spawn(cooldown) //10 seconds by default, if the source of the deactivation does not keep stat that long.
|
||||
lamp_recharging = 0
|
||||
else
|
||||
AddLuminosity(lamp_intensity)
|
||||
|
||||
|
||||
@@ -54,8 +54,10 @@
|
||||
/obj/item/weapon/robot_module/proc/fix_modules()
|
||||
for(var/obj/item/I in modules)
|
||||
I.flags |= NODROP
|
||||
I.mouse_opacity = 2
|
||||
if(emag)
|
||||
emag.flags |= NODROP
|
||||
emag.mouse_opacity = 2
|
||||
|
||||
/obj/item/weapon/robot_module/proc/on_emag()
|
||||
return
|
||||
|
||||
@@ -153,7 +153,7 @@
|
||||
/mob/living/silicon/bullet_act(obj/item/projectile/Proj)
|
||||
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
|
||||
adjustBruteLoss(Proj.damage)
|
||||
Proj.on_hit(src,2)
|
||||
Proj.on_hit(src)
|
||||
return 2
|
||||
|
||||
/mob/living/silicon/apply_effect(effect = 0,effecttype = STUN, blocked = 0)
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
return
|
||||
if(Proj.damage_type == BURN || Proj.damage_type == BRUTE)
|
||||
adjustBruteLoss(Proj.damage)
|
||||
Proj.on_hit(src, 0)
|
||||
Proj.on_hit(src)
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/construct/narsie_act()
|
||||
|
||||
@@ -108,6 +108,8 @@
|
||||
icon_state = icon_dead
|
||||
return
|
||||
..()
|
||||
update_corgi_fluff()
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/Topic(href, href_list)
|
||||
@@ -209,6 +211,7 @@
|
||||
//Corgis are supposed to be simpler, so only a select few objects can actually be put
|
||||
//to be compatible with them. The objects are below.
|
||||
//Many hats added, Some will probably be removed, just want to see which ones are popular.
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/proc/place_on_head(obj/item/item_to_add, mob/user)
|
||||
|
||||
if(istype(item_to_add,/obj/item/weapon/c4)) // last thing he ever wears, I guess
|
||||
@@ -222,7 +225,6 @@
|
||||
user.visible_message("[user] pets [src].","<span class='notice'>You rest your hand on [src]'s head for a moment.</span>")
|
||||
return
|
||||
|
||||
|
||||
var/valid = 0
|
||||
|
||||
//Various hats and items (worn on his head) change Ian's behaviour. His attributes are reset when a hat is removed.
|
||||
@@ -232,128 +234,16 @@
|
||||
switch(item_to_add.type)
|
||||
if( /obj/item/clothing/glasses/sunglasses, /obj/item/clothing/head/that, /obj/item/clothing/head/collectable/paper,
|
||||
/obj/item/clothing/head/hardhat, /obj/item/clothing/head/collectable/hardhat, /obj/item/clothing/head/hardhat/white,
|
||||
/obj/item/weapon/paper)
|
||||
valid = 1
|
||||
|
||||
if(/obj/item/clothing/head/helmet)
|
||||
name = "Sergeant [real_name]"
|
||||
desc = "The ever-loyal, the ever-vigilant."
|
||||
valid = 1
|
||||
|
||||
if(/obj/item/clothing/head/chefhat, /obj/item/clothing/head/collectable/chef)
|
||||
name = "Sous chef [real_name]"
|
||||
desc = "Your food will be taste-tested. All of it."
|
||||
valid = 1
|
||||
|
||||
if(/obj/item/clothing/head/caphat, /obj/item/clothing/head/collectable/captain)
|
||||
name = "Captain [real_name]"
|
||||
desc = "Probably better than the last captain."
|
||||
valid = 1
|
||||
|
||||
if(/obj/item/clothing/head/kitty, /obj/item/clothing/head/collectable/kitty)
|
||||
name = "Runtime"
|
||||
emote_see = list("coughs up a furball", "stretches")
|
||||
emote_hear = list("purrs")
|
||||
speak = list("Purrr", "Meow!", "MAOOOOOW!", "HISSSSS", "MEEEEEEW")
|
||||
desc = "It's a cute little kitty-cat! ... wait ... what the hell?"
|
||||
valid = 1
|
||||
|
||||
if(/obj/item/clothing/head/rabbitears, /obj/item/clothing/head/collectable/rabbitears)
|
||||
name = "Hoppy"
|
||||
emote_see = list("twitches its nose", "hops around a bit")
|
||||
desc = "This is Hoppy. It's a corgi-...urmm... bunny rabbit"
|
||||
valid = 1
|
||||
|
||||
if(/obj/item/clothing/head/beret, /obj/item/clothing/head/collectable/beret)
|
||||
name = "Yann"
|
||||
desc = "Mon dieu! C'est un chien!"
|
||||
speak = list("le woof!", "le bark!", "JAPPE!!")
|
||||
emote_see = list("cowers in fear.", "surrenders.", "plays dead.","looks as though there is a wall in front of him.")
|
||||
valid = 1
|
||||
|
||||
if(/obj/item/clothing/head/det_hat)
|
||||
name = "Detective [real_name]"
|
||||
desc = "[name] sees through your lies..."
|
||||
emote_see = list("investigates the area.","sniffs around for clues.","searches for scooby snacks.")
|
||||
valid = 1
|
||||
|
||||
if(/obj/item/clothing/head/nursehat)
|
||||
name = "Nurse [real_name]"
|
||||
desc = "[name] needs 100cc of beef jerky... STAT!"
|
||||
valid = 1
|
||||
|
||||
if(/obj/item/clothing/head/pirate, /obj/item/clothing/head/collectable/pirate)
|
||||
name = "[pick("Ol'","Scurvy","Black","Rum","Gammy","Bloody","Gangrene","Death","Long-John")] [pick("kibble","leg","beard","tooth","poop-deck","Threepwood","Le Chuck","corsair","Silver","Crusoe")]"
|
||||
desc = "Yaarghh!! Thar' be a scurvy dog!"
|
||||
emote_see = list("hunts for treasure.","stares coldly...","gnashes his tiny corgi teeth!")
|
||||
emote_hear = list("growls ferociously!", "snarls.")
|
||||
speak = list("Arrrrgh!!","Grrrrrr!")
|
||||
valid = 1
|
||||
|
||||
if(/obj/item/clothing/head/ushanka)
|
||||
name = "[pick("Comrade","Commissar","Glorious Leader")] [real_name]"
|
||||
desc = "A follower of Karl Barx."
|
||||
emote_see = list("contemplates the failings of the capitalist economic model.", "ponders the pros and cons of vanguardism.")
|
||||
valid = 1
|
||||
|
||||
if(/obj/item/clothing/head/warden, /obj/item/clothing/head/collectable/police)
|
||||
name = "Officer [real_name]"
|
||||
emote_see = list("drools.","looks for donuts.")
|
||||
desc = "Stop right there criminal scum!"
|
||||
valid = 1
|
||||
|
||||
if(/obj/item/clothing/head/wizard/fake, /obj/item/clothing/head/wizard, /obj/item/clothing/head/collectable/wizard)
|
||||
name = "Grandwizard [real_name]"
|
||||
speak = list("YAP", "Woof!", "Bark!", "AUUUUUU", "EI NATH!")
|
||||
valid = 1
|
||||
|
||||
if(/obj/item/clothing/head/cardborg)
|
||||
name = "Borgi"
|
||||
speak = list("Ping!","Beep!","Woof!")
|
||||
emote_see = list("goes rogue.", "sniffs out non-humans.")
|
||||
desc = "Result of robotics budget cuts."
|
||||
valid = 1
|
||||
|
||||
if(/obj/item/weapon/bedsheet)
|
||||
name = "\improper Ghost"
|
||||
speak = list("WoooOOOooo~","AUUUUUUUUUUUUUUUUUU")
|
||||
emote_see = list("stumbles around.", "shivers.")
|
||||
emote_hear = list("howls!","groans.")
|
||||
desc = "Spooky!"
|
||||
valid = 1
|
||||
|
||||
if(/obj/item/clothing/head/helmet/space/santahat)
|
||||
name = "Santa's Corgi Helper"
|
||||
emote_hear = list("barks Christmas songs.", "yaps merrily!")
|
||||
emote_see = list("looks for presents.", "checks his list.")
|
||||
desc = "He's very fond of milk and cookies."
|
||||
valid = 1
|
||||
|
||||
if(/obj/item/clothing/head/soft)
|
||||
name = "Corgi Tech [real_name]"
|
||||
desc = "The reason your yellow gloves have chew-marks."
|
||||
valid = 1
|
||||
|
||||
if(/obj/item/clothing/head/hardhat/reindeer)
|
||||
name = "[real_name] the red-nosed Corgi"
|
||||
emote_hear = list("lights the way!", "illuminates.", "yaps!")
|
||||
desc = "He has a very shiny nose."
|
||||
SetLuminosity(1)
|
||||
valid = 1
|
||||
|
||||
if(/obj/item/clothing/head/sombrero)
|
||||
name = "Segnor [real_name]"
|
||||
desc = "You must respect elder [real_name]"
|
||||
valid = 1
|
||||
|
||||
if(/obj/item/clothing/head/hopcap)
|
||||
name = "Lieutenant [real_name]"
|
||||
desc = "Can actually be trusted to not run off on his own."
|
||||
valid = 1
|
||||
|
||||
if(/obj/item/clothing/head/helmet/space/hardsuit/deathsquad)
|
||||
name = "Trooper [real_name]"
|
||||
desc = "That's not red paint. That's real corgi blood."
|
||||
/obj/item/weapon/paper, /obj/item/clothing/head/helmet, /obj/item/clothing/head/chefhat, /obj/item/clothing/head/collectable/chef,
|
||||
/obj/item/clothing/head/caphat, /obj/item/clothing/head/collectable/captain, /obj/item/clothing/head/kitty,
|
||||
/obj/item/clothing/head/collectable/kitty, /obj/item/clothing/head/rabbitears, /obj/item/clothing/head/collectable/rabbitears,
|
||||
/obj/item/clothing/head/beret, /obj/item/clothing/head/collectable/beret, /obj/item/clothing/head/det_hat,
|
||||
/obj/item/clothing/head/nursehat, /obj/item/clothing/head/pirate, /obj/item/clothing/head/collectable/pirate,
|
||||
/obj/item/clothing/head/ushanka, /obj/item/clothing/head/warden, /obj/item/clothing/head/collectable/police,
|
||||
/obj/item/clothing/head/wizard/fake, /obj/item/clothing/head/wizard, /obj/item/clothing/head/collectable/wizard,
|
||||
/obj/item/clothing/head/cardborg, /obj/item/weapon/bedsheet, /obj/item/clothing/head/helmet/space/santahat,
|
||||
/obj/item/clothing/head/soft, /obj/item/clothing/head/hardhat/reindeer, /obj/item/clothing/head/sombrero,
|
||||
/obj/item/clothing/head/hopcap, /obj/item/clothing/head/helmet/space/hardsuit/deathsquad)
|
||||
valid = 1
|
||||
|
||||
if(valid)
|
||||
@@ -368,8 +258,8 @@
|
||||
"<span class='italics'>You hear a friendly-sounding bark.</span>")
|
||||
item_to_add.loc = src
|
||||
src.inventory_head = item_to_add
|
||||
update_corgi_fluff()
|
||||
regenerate_icons()
|
||||
|
||||
else
|
||||
if(user && !user.drop_item())
|
||||
user << "<span class='warning'>\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!</span>"
|
||||
@@ -384,6 +274,108 @@
|
||||
|
||||
return valid
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/proc/update_corgi_fluff()
|
||||
switch(src.inventory_head.type)
|
||||
if(/obj/item/clothing/head/helmet)
|
||||
name = "Sergeant [real_name]"
|
||||
desc = "The ever-loyal, the ever-vigilant."
|
||||
|
||||
if(/obj/item/clothing/head/chefhat, /obj/item/clothing/head/collectable/chef)
|
||||
name = "Sous chef [real_name]"
|
||||
desc = "Your food will be taste-tested. All of it."
|
||||
|
||||
|
||||
if(/obj/item/clothing/head/caphat, /obj/item/clothing/head/collectable/captain)
|
||||
name = "Captain [real_name]"
|
||||
desc = "Probably better than the last captain."
|
||||
|
||||
if(/obj/item/clothing/head/kitty, /obj/item/clothing/head/collectable/kitty)
|
||||
name = "Runtime"
|
||||
emote_see = list("coughs up a furball", "stretches")
|
||||
emote_hear = list("purrs")
|
||||
speak = list("Purrr", "Meow!", "MAOOOOOW!", "HISSSSS", "MEEEEEEW")
|
||||
desc = "It's a cute little kitty-cat! ... wait ... what the hell?"
|
||||
|
||||
if(/obj/item/clothing/head/rabbitears, /obj/item/clothing/head/collectable/rabbitears)
|
||||
name = "Hoppy"
|
||||
emote_see = list("twitches its nose", "hops around a bit")
|
||||
desc = "This is Hoppy. It's a corgi-...urmm... bunny rabbit"
|
||||
|
||||
if(/obj/item/clothing/head/beret, /obj/item/clothing/head/collectable/beret)
|
||||
name = "Yann"
|
||||
desc = "Mon dieu! C'est un chien!"
|
||||
speak = list("le woof!", "le bark!", "JAPPE!!")
|
||||
emote_see = list("cowers in fear.", "surrenders.", "plays dead.","looks as though there is a wall in front of him.")
|
||||
|
||||
if(/obj/item/clothing/head/det_hat)
|
||||
name = "Detective [real_name]"
|
||||
desc = "[name] sees through your lies..."
|
||||
emote_see = list("investigates the area.","sniffs around for clues.","searches for scooby snacks.")
|
||||
|
||||
if(/obj/item/clothing/head/nursehat)
|
||||
name = "Nurse [real_name]"
|
||||
desc = "[name] needs 100cc of beef jerky... STAT!"
|
||||
|
||||
if(/obj/item/clothing/head/pirate, /obj/item/clothing/head/collectable/pirate)
|
||||
name = "[pick("Ol'","Scurvy","Black","Rum","Gammy","Bloody","Gangrene","Death","Long-John")] [pick("kibble","leg","beard","tooth","poop-deck","Threepwood","Le Chuck","corsair","Silver","Crusoe")]"
|
||||
desc = "Yaarghh!! Thar' be a scurvy dog!"
|
||||
emote_see = list("hunts for treasure.","stares coldly...","gnashes his tiny corgi teeth!")
|
||||
emote_hear = list("growls ferociously!", "snarls.")
|
||||
speak = list("Arrrrgh!!","Grrrrrr!")
|
||||
|
||||
if(/obj/item/clothing/head/ushanka)
|
||||
name = "[pick("Comrade","Commissar","Glorious Leader")] [real_name]"
|
||||
desc = "A follower of Karl Barx."
|
||||
emote_see = list("contemplates the failings of the capitalist economic model.", "ponders the pros and cons of vanguardism.")
|
||||
|
||||
if(/obj/item/clothing/head/warden, /obj/item/clothing/head/collectable/police)
|
||||
name = "Officer [real_name]"
|
||||
emote_see = list("drools.","looks for donuts.")
|
||||
desc = "Stop right there criminal scum!"
|
||||
|
||||
if(/obj/item/clothing/head/wizard/fake, /obj/item/clothing/head/wizard, /obj/item/clothing/head/collectable/wizard)
|
||||
name = "Grandwizard [real_name]"
|
||||
speak = list("YAP", "Woof!", "Bark!", "AUUUUUU", "EI NATH!")
|
||||
|
||||
if(/obj/item/clothing/head/cardborg)
|
||||
name = "Borgi"
|
||||
speak = list("Ping!","Beep!","Woof!")
|
||||
emote_see = list("goes rogue.", "sniffs out non-humans.")
|
||||
desc = "Result of robotics budget cuts."
|
||||
|
||||
if(/obj/item/weapon/bedsheet)
|
||||
name = "\improper Ghost"
|
||||
speak = list("WoooOOOooo~","AUUUUUUUUUUUUUUUUUU")
|
||||
emote_see = list("stumbles around.", "shivers.")
|
||||
emote_hear = list("howls!","groans.")
|
||||
desc = "Spooky!"
|
||||
|
||||
if(/obj/item/clothing/head/helmet/space/santahat)
|
||||
name = "Santa's Corgi Helper"
|
||||
emote_hear = list("barks Christmas songs.", "yaps merrily!")
|
||||
emote_see = list("looks for presents.", "checks his list.")
|
||||
desc = "He's very fond of milk and cookies."
|
||||
|
||||
if(/obj/item/clothing/head/soft)
|
||||
name = "Corgi Tech [real_name]"
|
||||
desc = "The reason your yellow gloves have chew-marks."
|
||||
|
||||
if(/obj/item/clothing/head/hardhat/reindeer)
|
||||
name = "[real_name] the red-nosed Corgi"
|
||||
emote_hear = list("lights the way!", "illuminates.", "yaps!")
|
||||
desc = "He has a very shiny nose."
|
||||
|
||||
if(/obj/item/clothing/head/sombrero)
|
||||
name = "Segnor [real_name]"
|
||||
desc = "You must respect elder [real_name]"
|
||||
|
||||
if(/obj/item/clothing/head/hopcap)
|
||||
name = "Lieutenant [real_name]"
|
||||
desc = "Can actually be trusted to not run off on his own."
|
||||
|
||||
if(/obj/item/clothing/head/helmet/space/hardsuit/deathsquad)
|
||||
name = "Trooper [real_name]"
|
||||
desc = "That's not red paint. That's real corgi blood."
|
||||
|
||||
//IAN! SQUEEEEEEEEE~
|
||||
/mob/living/simple_animal/pet/dog/corgi/Ian
|
||||
|
||||
@@ -14,7 +14,8 @@
|
||||
regenerate_icons()
|
||||
user << "<span class='notice'>You put the [P] around [src]'s neck.</span>"
|
||||
if(P.tagname)
|
||||
name = "\proper [P.tagname]"
|
||||
real_name = "\proper [P.tagname]"
|
||||
name = real_name
|
||||
qdel(P)
|
||||
return
|
||||
if(istype(O, /obj/item/weapon/newspaper))
|
||||
|
||||
@@ -0,0 +1,530 @@
|
||||
/mob/living/simple_animal/hostile/guardian
|
||||
name = "Guardian Spirit"
|
||||
real_name = "Guardian Spirit"
|
||||
desc = "A mysterious being that stands by it's charge, ever vigilant."
|
||||
speak_emote = list("intones")
|
||||
response_help = "passes through"
|
||||
response_disarm = "flails at"
|
||||
response_harm = "punches"
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "stand"
|
||||
icon_living = "stand"
|
||||
speed = 0
|
||||
a_intent = "harm"
|
||||
stop_automated_movement = 1
|
||||
floating = 1
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
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
|
||||
attacktext = "punches"
|
||||
maxHealth = 100000 //The spirit itself is invincible
|
||||
health = 100000
|
||||
environment_smash = 0
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
butcher_results = list(/obj/item/weapon/ectoplasm = 1)
|
||||
var/cooldown = 0
|
||||
var/damage_transfer = 1 //how much damage from each attack we transfer to the owner
|
||||
var/mob/living/summoner
|
||||
var/range = 10 //how far from the user the spirit can be
|
||||
var/playstyle_string = "You are a standard Guardian. You shouldn't exist!"
|
||||
var/magic_fluff_string = " You draw the Coder, symbolizing bugs and errors. This shouldn't happen! Submit a bug report!"
|
||||
var/tech_fluff_string = "BOOT SEQUENCE COMPLETE. ERROR MODULE LOADED. THIS SHOULDN'T HAPPEN. Submit a bug report!"
|
||||
var/bio_fluff_string = "Your scarabs fail to mutate. This shouldn't happen! Submit a bug report!"
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/Life() //Dies if the summoner dies
|
||||
..()
|
||||
if(summoner)
|
||||
if(summoner.stat == DEAD)
|
||||
src << "<span class='danger'>Your summoner has died!</span>"
|
||||
visible_message("<span class='danger'>The [src] dies along with its user!</span>")
|
||||
ghostize()
|
||||
qdel(src)
|
||||
else
|
||||
src << "<span class='danger'>Your summoner has died!</span>"
|
||||
visible_message("<span class='danger'>The [src] dies along with its user!</span>")
|
||||
ghostize()
|
||||
qdel(src)
|
||||
if(summoner)
|
||||
if (get_dist(get_turf(summoner),get_turf(src)) <= range)
|
||||
return
|
||||
else
|
||||
src << "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]"
|
||||
visible_message("<span class='danger'>The [src] jumps back to its user.</span>")
|
||||
loc = get_turf(summoner)
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/Move() //Returns to summoner if they move out of range
|
||||
..()
|
||||
if(summoner)
|
||||
if (get_dist(get_turf(summoner),get_turf(src)) <= range)
|
||||
return
|
||||
else
|
||||
src << "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]"
|
||||
visible_message("<span class='danger'>The [src] jumps back to its user.</span>")
|
||||
loc = get_turf(summoner)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/adjustBruteLoss(amount) //The spirit is invincible, but passes on damage to the summoner
|
||||
var/damage = amount * src.damage_transfer
|
||||
if (src.summoner)
|
||||
src.summoner.adjustBruteLoss(damage)
|
||||
if(damage)
|
||||
src.summoner << "<span class='danger'><B>Your [src.name] is under attack! You take damage!</span></B>"
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/ex_act(severity, target)
|
||||
switch (severity)
|
||||
if (1)
|
||||
if(src.summoner)
|
||||
src.summoner << "<span class='danger'><B>Your [src.name] was blown up!</span></B>"
|
||||
src.summoner.gib()
|
||||
gib()
|
||||
return
|
||||
if (2)
|
||||
adjustBruteLoss(60)
|
||||
|
||||
if(3)
|
||||
adjustBruteLoss(30)
|
||||
|
||||
|
||||
//Manifest, Recall, Communicate
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/verb/Manifest()
|
||||
set name = "Manifest"
|
||||
set category = "Guardian"
|
||||
set desc = "Spring forth into battle!"
|
||||
if(cooldown > world.time)
|
||||
return
|
||||
if(src.loc == summoner)
|
||||
src.loc = get_turf(summoner)
|
||||
cooldown = world.time + 30
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/verb/Recall()
|
||||
set name = "Recall"
|
||||
set category = "Guardian"
|
||||
set desc = "Return to your summoner."
|
||||
if(cooldown > world.time)
|
||||
return
|
||||
src.loc = summoner
|
||||
cooldown = world.time + 30
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/verb/Communicate()
|
||||
set name = "Communicate"
|
||||
set category = "Guardian"
|
||||
set desc = "Communicate telepathically with your summoner."
|
||||
var/input = stripped_input(src, "Please enter a message to tell your summoner.", "Guardian", "")
|
||||
|
||||
for(var/mob/M in mob_list)
|
||||
if(M == src.summoner)
|
||||
M << "<span class='boldannounce'><i>[src]:</i> [input]</span>"
|
||||
src << "<span class='boldannounce'><i>[src]:</i> [input]</span>"
|
||||
|
||||
/mob/living/proc/guardian_comm()
|
||||
set name = "Communicate"
|
||||
set category = "Guardian"
|
||||
set desc = "Communicate telepathically with your guardian."
|
||||
var/input = stripped_input(src, "Please enter a message to tell your guardian.", "Message", "")
|
||||
|
||||
for(var/mob/living/simple_animal/hostile/guardian/M in mob_list)
|
||||
if(M.summoner == src)
|
||||
M << "<span class='boldannounce'><i>[src]:</i> [input]</span>"
|
||||
src << "<span class='boldannounce'><i>[src]:</i> [input]</span>"
|
||||
|
||||
|
||||
//////////////////////////TYPES OF GUARDIANS
|
||||
|
||||
|
||||
//Fire. Low damage, low resistance, sets mobs on fire when bumping
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/fire
|
||||
a_intent = "help"
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 10
|
||||
attack_sound = 'sound/items/Welder.ogg'
|
||||
attacktext = "sears"
|
||||
damage_transfer = 0.7
|
||||
range = 10
|
||||
playstyle_string = "As a fire type, you have only light damage resistance, but will ignite any enemy you bump into."
|
||||
environment_smash = 1
|
||||
magic_fluff_string = "..And draw Atmosia, bringer of cleansing fires!"
|
||||
tech_fluff_string = "Boot sequence complete. Incendiary combat modules loaded. Nanoswarm online."
|
||||
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of igniting enemies on touch."
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj)
|
||||
if(istype(AM, /mob/living/))
|
||||
var/mob/living/M = AM
|
||||
if(AM != src.summoner)
|
||||
M.adjust_fire_stacks(10)
|
||||
M.IgniteMob()
|
||||
|
||||
//Standard
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/punch
|
||||
melee_damage_lower = 25
|
||||
melee_damage_upper = 25
|
||||
damage_transfer = 0.5
|
||||
playstyle_string = "As a standard type you have no special abilities, but have a high damage resistance and a powerful attack capable of smashing through walls."
|
||||
environment_smash = 2
|
||||
magic_fluff_string = "..And draw the Assistant, faceless and generic, but never to be underestimated."
|
||||
tech_fluff_string = "Boot sequence complete. Standard combat modules loaded. Nanoswarm online."
|
||||
bio_fluff_string = "Your scarab swarm stirs to life, ready to tear apart your enemies."
|
||||
var/battlecry = "AT"
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/punch/verb/Battlecry()
|
||||
set name = "Set Battlecry"
|
||||
set category = "Guardian"
|
||||
set desc = "Choose what you shout as you punch"
|
||||
var/input = stripped_input(src,"What do you want your battlecry to be? Max length of 6 characters.", ,"", 6)
|
||||
if(input)
|
||||
src.battlecry = input
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/punch/AttackingTarget()
|
||||
..()
|
||||
if(istype(target, /mob/living))
|
||||
src.say("[src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry]\
|
||||
[src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry]")
|
||||
playsound(loc, src.attack_sound, 50, 1, 1)
|
||||
playsound(loc, src.attack_sound, 50, 1, 1)
|
||||
playsound(loc, src.attack_sound, 50, 1, 1)
|
||||
playsound(loc, src.attack_sound, 50, 1, 1)
|
||||
|
||||
|
||||
|
||||
|
||||
//Fast Standard. Does less damage, has less resistance, but moves faster, has higher range
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/fast
|
||||
melee_damage_lower = 20
|
||||
melee_damage_upper = 20
|
||||
damage_transfer = 0.7
|
||||
speed = -1
|
||||
range = 15
|
||||
attacktext = "slices"
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
playstyle_string = "As a fast standard type, you have no special abilities and only light damage resistance, but deal high damage at high speed."
|
||||
environment_smash = 1
|
||||
magic_fluff_string = "..And draw the Shoes, bringer of great speed. The card is badly damaged, and barely legible."
|
||||
tech_fluff_string = "Boot sequence complete. High speed combat modules active. Nanoswarm online."
|
||||
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of moving at blinding speed."
|
||||
|
||||
//Defender. Does no damage, takes no damage, moves slowly.
|
||||
/mob/living/simple_animal/hostile/guardian/shield
|
||||
melee_damage_lower = 0
|
||||
melee_damage_upper = 0
|
||||
speed = 1
|
||||
range = 10
|
||||
damage_transfer = 0
|
||||
friendly = "stares down"
|
||||
status_flags = CANPUSH
|
||||
playstyle_string = "As a defensive type, you are incapable of attacking and move slowly, but completely nullify any attack that hits you."
|
||||
magic_fluff_string = "..And draw the Juggernaut, an invincible, unstoppable force."
|
||||
tech_fluff_string = "Boot sequence complete. Defensive modules active. Nanoswarm online."
|
||||
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, helpless, but invulnerable."
|
||||
|
||||
//Scout. No damage, high range, high mobility, low resistance
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/scout
|
||||
range = 255
|
||||
incorporeal_move = 1
|
||||
damage_transfer = 1.2
|
||||
melee_damage_lower = 0
|
||||
melee_damage_upper = 0
|
||||
alpha = 60
|
||||
friendly = "quietly assesses"
|
||||
playstyle_string = "As a scout type, you are incapable of attacking, but have infinite range, can pass through walls, and crawl through vents."
|
||||
magic_fluff_string = "..And draw the AI, all seeing and all knowing."
|
||||
tech_fluff_string = "Boot sequence complete. Surveillance modules loaded. Nanoswarm online."
|
||||
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, helpless, but near invsible, and capable of near unlimited travel."
|
||||
|
||||
//Healer
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/healer
|
||||
a_intent = "help"
|
||||
friendly = "heals"
|
||||
speed = 1
|
||||
melee_damage_lower = 0
|
||||
melee_damage_upper = 0
|
||||
playstyle_string = "As a healer type, you are incapable of attacking, but can mend any wound simply by touching a target."
|
||||
magic_fluff_string = "..And draw the CMO, a potent force of life and health."
|
||||
tech_fluff_string = "Boot sequence complete. Medical modules active. Nanoswarm online."
|
||||
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of mending wounds."
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/healer/AttackingTarget()
|
||||
..()
|
||||
if(src.loc == summoner)
|
||||
src << "<span class='danger'><B>You must be manifested to heal!</span></B>"
|
||||
return
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
C.adjustBruteLoss(-5)
|
||||
C.adjustFireLoss(-5)
|
||||
C.adjustOxyLoss(-5)
|
||||
C.adjustToxLoss(-5)
|
||||
|
||||
/obj/item/projectile/guardian
|
||||
name = "crystal spray"
|
||||
icon_state = "guardian"
|
||||
damage = 4
|
||||
damage_type = BRUTE
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/ranged
|
||||
a_intent = "help"
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 10
|
||||
damage_transfer = 1.2
|
||||
projectiletype = /obj/item/projectile/guardian
|
||||
ranged_cooldown_cap = 0
|
||||
projectilesound = 'sound/effects/hit_on_shattered_glass.ogg'
|
||||
ranged = 1
|
||||
range = 13
|
||||
playstyle_string = "As a ranged type, you have only light damage resistance, but are capable of spraying shards of crystal at incredibly high speed."
|
||||
magic_fluff_string = "..And draw the Sentinel, an alien master of ranged combat."
|
||||
tech_fluff_string = "Boot sequence complete. Ranged combat modules active. Nanoswarm online."
|
||||
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of spraying shards of crystal."
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/bluespace
|
||||
ranged = 1
|
||||
range = 15
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
speed = -1
|
||||
attack_sound = 'sound/weapons/emitter.ogg'
|
||||
projectiletype = /obj/item/projectile/magic/teleport
|
||||
projectilesound = 'sound/weapons/emitter.ogg'
|
||||
playstyle_string = "As a bluespace type, you have only light damage resistance, but are capable of shooting teleporation bolts as well as flinging enemies away with your standard attack."
|
||||
magic_fluff_string = "..And draw the Wizard, master of teleportation."
|
||||
tech_fluff_string = "Boot sequence complete. Experimental bluespace combat modules active. Nanoswarm online."
|
||||
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, crackling with bluespace energy."
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/bluespace/AttackingTarget()
|
||||
..()
|
||||
if(istype(target, /atom/movable))
|
||||
var/atom/movable/M = target
|
||||
if(!M.anchored && M != src.summoner)
|
||||
do_teleport(M, M, 10)
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/bomb
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
damage_transfer = 0.6
|
||||
range = 13
|
||||
playstyle_string = "As an explosive type, you have only moderate close combat abilities, but are capable of converting any adjacent item into a disguised bomb via shift click."
|
||||
magic_fluff_string = "..And draw the Scientist, master of explosive death."
|
||||
tech_fluff_string = "Boot sequence complete. Explosive modules active. Nanoswarm online."
|
||||
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of stealthily booby trapping items."
|
||||
var/bomb_cooldown = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/bomb/ShiftClickOn(atom/movable/A)
|
||||
if(src.loc == summoner)
|
||||
src << "<span class='danger'><B>You must be manifested to create bombs!</span></B>"
|
||||
return
|
||||
if(istype(A, /obj/))
|
||||
if(bomb_cooldown <= world.time && !stat)
|
||||
var/obj/item/weapon/guardian_bomb/B = new /obj/item/weapon/guardian_bomb(get_turf(A))
|
||||
src << "<span class='danger'><B>Success! Bomb armed!</span></B>"
|
||||
bomb_cooldown = world.time + 400
|
||||
B.spawner = src
|
||||
B.disguise (A)
|
||||
else
|
||||
src << "<span class='danger'><B>Your powers are on cooldown! You must wait 40 seconds between bombs.</span></B>"
|
||||
|
||||
/obj/item/weapon/guardian_bomb
|
||||
name = "bomb"
|
||||
desc = "You shouldn't be seeing this!"
|
||||
var/obj/stored_obj
|
||||
var/mob/living/spawner
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/guardian_bomb/proc/disguise(var/obj/A)
|
||||
A.loc = src
|
||||
stored_obj = A
|
||||
anchored = A.anchored
|
||||
density = A.density
|
||||
appearance = A.appearance
|
||||
spawn(600)
|
||||
stored_obj.loc = get_turf(src.loc)
|
||||
spawner << "<span class='danger'><B>Failure! Your trap didn't catch anyone this time.</span></B>"
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/guardian_bomb/proc/detonate(var/mob/living/user)
|
||||
user << "<span class='danger'><B>The [src] was boobytrapped!</span></B>"
|
||||
spawner << "<span class='danger'><B>Success! Your trap caught [user]</span></B>"
|
||||
stored_obj.loc = get_turf(src.loc)
|
||||
playsound(get_turf(src),'sound/effects/Explosion2.ogg', 200, 1)
|
||||
user.ex_act(2)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/guardian_bomb/attackby(mob/living/user)
|
||||
detonate(user)
|
||||
return
|
||||
|
||||
/obj/item/weapon/guardian_bomb/pickup(mob/living/user)
|
||||
detonate(user)
|
||||
return
|
||||
|
||||
/obj/item/weapon/guardian_bomb/examine(mob/user)
|
||||
stored_obj.examine(user)
|
||||
if(get_dist(user,src)<=2)
|
||||
user << "<span class='notice'>Looks odd!</span>"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
////////Creation
|
||||
|
||||
/obj/item/weapon/guardiancreator
|
||||
name = "deck of tarot cards"
|
||||
desc = "An enchanted deck of tarot cards, rumored to be a source of unimaginable power. "
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "deck_syndicate_full"
|
||||
var/used = FALSE
|
||||
var/theme = "magic"
|
||||
var/mob_name = "Guardian Spirit"
|
||||
var/use_message = "You shuffle the deck..."
|
||||
var/used_message = "All the cards seem to be blank now."
|
||||
var/failure_message = "..And draw a card! It's...blank? Maybe you should try again later."
|
||||
var/list/possible_guardians = list("Fire", "Standard", "Scout", "Shield", "Ranged", "Healer", "Fast", "Explosive")
|
||||
var/random = TRUE
|
||||
|
||||
/obj/item/weapon/guardiancreator/attack_self(mob/living/user)
|
||||
if(used == TRUE)
|
||||
user << "[used_message]"
|
||||
return
|
||||
used = TRUE
|
||||
user << "[use_message]"
|
||||
var/list/candidates = get_candidates(BE_ALIEN, ALIEN_AFK_BRACKET)
|
||||
|
||||
shuffle(candidates)
|
||||
|
||||
var/time_passed = world.time
|
||||
var/list/consenting_candidates = list()
|
||||
|
||||
for(var/candidate in candidates)
|
||||
|
||||
spawn(0)
|
||||
switch(alert(candidate, "Would you like to play as the [mob_name] of [user.real_name]? Please choose quickly!","Confirmation","Yes","No"))
|
||||
if("Yes")
|
||||
if((world.time-time_passed)>=50 || !src)
|
||||
return
|
||||
consenting_candidates += candidate
|
||||
|
||||
sleep(50)
|
||||
|
||||
if(!src)
|
||||
return
|
||||
|
||||
if(consenting_candidates.len)
|
||||
var/client/C = null
|
||||
C = pick(consenting_candidates)
|
||||
spawn_guardian(user, C.key)
|
||||
else
|
||||
user << "[failure_message]"
|
||||
used = FALSE
|
||||
|
||||
|
||||
/obj/item/weapon/guardiancreator/proc/spawn_guardian(var/mob/living/user, var/key)
|
||||
var/gaurdiantype = "Standard"
|
||||
if(random)
|
||||
gaurdiantype = pick(possible_guardians)
|
||||
else
|
||||
gaurdiantype = input(user, "Pick the type pf [mob_name]", "[mob_name] Creation") as null|anything in possible_guardians
|
||||
var/pickedtype = /mob/living/simple_animal/hostile/guardian/punch
|
||||
var/picked_color = randomColor(0)
|
||||
switch(gaurdiantype)
|
||||
|
||||
if("Fire")
|
||||
pickedtype = /mob/living/simple_animal/hostile/guardian/fire
|
||||
|
||||
if("Standard")
|
||||
pickedtype = /mob/living/simple_animal/hostile/guardian/punch
|
||||
|
||||
if("Scout")
|
||||
pickedtype = /mob/living/simple_animal/hostile/guardian/scout
|
||||
|
||||
if("Shield")
|
||||
pickedtype = /mob/living/simple_animal/hostile/guardian/shield
|
||||
|
||||
if("Ranged")
|
||||
pickedtype = /mob/living/simple_animal/hostile/guardian/ranged
|
||||
|
||||
if("Healer")
|
||||
pickedtype = /mob/living/simple_animal/hostile/guardian/healer
|
||||
|
||||
if("Fast")
|
||||
pickedtype = /mob/living/simple_animal/hostile/guardian/fast
|
||||
|
||||
if("Bluespace")
|
||||
pickedtype = /mob/living/simple_animal/hostile/guardian/bluespace
|
||||
|
||||
if("Explosive")
|
||||
pickedtype = /mob/living/simple_animal/hostile/guardian/bomb
|
||||
|
||||
var/mob/living/simple_animal/hostile/guardian/G = new pickedtype(user)
|
||||
G.summoner = user
|
||||
G.key = key
|
||||
G.name = "[mob_name] [capitalize(picked_color)]"
|
||||
G.real_name = "[mob_name] [capitalize(picked_color)]"
|
||||
G.color = color2hex(picked_color)
|
||||
G << "You are a [mob_name] bound to serve [user.real_name]."
|
||||
G << "You are capable of manifesting or recalling to your master with verbs in the Guardian tab. You will also find a verb to communicate with them privately there."
|
||||
G << "While personally invincible, you will die if [user.real_name] does, and any damage dealt to you will have a portion passed on to them as you feed upon them to sustain yourself."
|
||||
G << "[G.playstyle_string]"
|
||||
user.verbs += /mob/living/proc/guardian_comm
|
||||
switch (theme)
|
||||
if("magic")
|
||||
user << "[G.magic_fluff_string]."
|
||||
if("tech")
|
||||
user << "[G.tech_fluff_string]."
|
||||
G.attacktext = "swarms"
|
||||
G.speak_emote = list("states")
|
||||
if("bio")
|
||||
user << "[G.bio_fluff_string]."
|
||||
G.attacktext = "swarms"
|
||||
G.speak_emote = list("chitters")
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/guardiancreator/choose
|
||||
random = FALSE
|
||||
|
||||
/obj/item/weapon/guardiancreator/tech
|
||||
name = "parasitic nanomachine injector"
|
||||
desc = "Though powerful in combat, these nanomachines require a living host as a source of fuel and home base."
|
||||
icon = 'icons/obj/syringe.dmi'
|
||||
icon_state = "combat_hypo"
|
||||
theme = "tech"
|
||||
mob_name = "Nanomachine Swarm"
|
||||
use_message = "You start to power on the injector..."
|
||||
used_message = "The injector has already been used."
|
||||
failure_message = "<B>...ERROR. BOOT SEQUENCE ABORTED. AI FAILED TO INTIALIZE. PLEASE CONTACT SUPPORT OR TRY AGAIN LATER.</B>"
|
||||
|
||||
/obj/item/weapon/guardiancreator/tech/choose
|
||||
random = FALSE
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/guardiancreator/biological
|
||||
name = "scarab egg cluster"
|
||||
desc = "A parasitic species that will nest in the closest living creature upon birth. While not great for your health, they'll defend their new 'hive' to the death."
|
||||
icon = 'icons/obj/syringe.dmi'
|
||||
icon_state = "combat_hypo"
|
||||
theme = "bio"
|
||||
mob_name = "Scarab Swarm"
|
||||
use_message = "The eggs begin to twitch..."
|
||||
used_message = "The cluster already hatched."
|
||||
failure_message = "<B>...but soon settles again. Guess they weren't ready to hatch after all.</B>"
|
||||
|
||||
/obj/item/weapon/guardiancreator/biological/choose
|
||||
random = FALSE
|
||||
@@ -40,14 +40,14 @@
|
||||
var/plant_cooldown = 30
|
||||
var/plants_off = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/alien/drone/Life()
|
||||
..()
|
||||
if(!stat)
|
||||
plant_cooldown--
|
||||
if(stance==HOSTILE_STANCE_IDLE)
|
||||
if(!plants_off && prob(10) && plant_cooldown<=0)
|
||||
plant_cooldown = initial(plant_cooldown)
|
||||
SpreadPlants()
|
||||
/mob/living/simple_animal/hostile/alien/drone/handle_automated_action()
|
||||
if(!..()) //AIStatus is off
|
||||
return
|
||||
plant_cooldown--
|
||||
if(AIStatus == AI_IDLE)
|
||||
if(!plants_off && prob(10) && plant_cooldown<=0)
|
||||
plant_cooldown = initial(plant_cooldown)
|
||||
SpreadPlants()
|
||||
|
||||
/mob/living/simple_animal/hostile/alien/sentinel
|
||||
name = "alien sentinel"
|
||||
@@ -87,18 +87,18 @@
|
||||
var/egg_cooldown = 30
|
||||
var/plant_cooldown = 30
|
||||
|
||||
/mob/living/simple_animal/hostile/alien/queen/Life()
|
||||
..()
|
||||
if(!stat)
|
||||
egg_cooldown--
|
||||
plant_cooldown--
|
||||
if(stance==HOSTILE_STANCE_IDLE)
|
||||
if(!plants_off && prob(10) && plant_cooldown<=0)
|
||||
plant_cooldown = initial(plant_cooldown)
|
||||
SpreadPlants()
|
||||
if(!sterile && prob(10) && egg_cooldown<=0)
|
||||
egg_cooldown = initial(egg_cooldown)
|
||||
LayEggs()
|
||||
/mob/living/simple_animal/hostile/alien/queen/handle_automated_action()
|
||||
if(!..()) //AIStatus is off
|
||||
return
|
||||
egg_cooldown--
|
||||
plant_cooldown--
|
||||
if(AIStatus == AI_IDLE)
|
||||
if(!plants_off && prob(10) && plant_cooldown<=0)
|
||||
plant_cooldown = initial(plant_cooldown)
|
||||
SpreadPlants()
|
||||
if(!sterile && prob(10) && egg_cooldown<=0)
|
||||
egg_cooldown = initial(egg_cooldown)
|
||||
LayEggs()
|
||||
|
||||
/mob/living/simple_animal/hostile/alien/proc/SpreadPlants()
|
||||
if(!isturf(loc) || istype(loc, /turf/space))
|
||||
|
||||
@@ -13,10 +13,7 @@
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(L.reagents)
|
||||
L.reagents.add_reagent("toxin", poison_per_bite)
|
||||
if(prob(poison_per_bite))
|
||||
L << "<span class='danger'>You feel a tiny prick.</span>"
|
||||
L.reagents.add_reagent(poison_type, poison_per_bite)
|
||||
L.reagents.add_reagent(poison_type, poison_per_bite)
|
||||
|
||||
|
||||
|
||||
@@ -77,20 +74,18 @@
|
||||
poison_per_bite = 5
|
||||
move_to_delay = 5
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/Life()
|
||||
..()
|
||||
if(!stat && !ckey)
|
||||
if(stance == HOSTILE_STANCE_IDLE)
|
||||
//1% chance to skitter madly away
|
||||
if(!busy && prob(1))
|
||||
/*var/list/move_targets = list()
|
||||
for(var/turf/T in orange(20, src))
|
||||
move_targets.Add(T)*/
|
||||
stop_automated_movement = 1
|
||||
Goto(pick(orange(20, src)), move_to_delay)
|
||||
spawn(50)
|
||||
stop_automated_movement = 0
|
||||
walk(src,0)
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/handle_automated_action()
|
||||
if(!..()) //AIStatus is off
|
||||
return 0
|
||||
if(AIStatus == AI_IDLE)
|
||||
//1% chance to skitter madly away
|
||||
if(!busy && prob(1))
|
||||
stop_automated_movement = 1
|
||||
Goto(pick(orange(20, src)), move_to_delay)
|
||||
spawn(50)
|
||||
stop_automated_movement = 0
|
||||
walk(src,0)
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/proc/GiveUp(C)
|
||||
spawn(100)
|
||||
@@ -100,53 +95,50 @@
|
||||
busy = 0
|
||||
stop_automated_movement = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/Life()
|
||||
..()
|
||||
if(!stat && !ckey)
|
||||
if(stance == HOSTILE_STANCE_IDLE)
|
||||
var/list/can_see = view(src, 10)
|
||||
//30% chance to stop wandering and do something
|
||||
if(!busy && prob(30))
|
||||
//first, check for potential food nearby to cocoon
|
||||
for(var/mob/living/C in can_see)
|
||||
if(C.stat && !istype(C,/mob/living/simple_animal/hostile/poison/giant_spider))
|
||||
cocoon_target = C
|
||||
busy = MOVING_TO_TARGET
|
||||
Goto(C, move_to_delay)
|
||||
//give up if we can't reach them after 10 seconds
|
||||
GiveUp(C)
|
||||
return
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/handle_automated_action()
|
||||
if(..())
|
||||
var/list/can_see = view(src, 10)
|
||||
if(!busy && prob(30)) //30% chance to stop wandering and do something
|
||||
//first, check for potential food nearby to cocoon
|
||||
for(var/mob/living/C in can_see)
|
||||
if(C.stat && !istype(C,/mob/living/simple_animal/hostile/poison/giant_spider))
|
||||
cocoon_target = C
|
||||
busy = MOVING_TO_TARGET
|
||||
Goto(C, move_to_delay)
|
||||
//give up if we can't reach them after 10 seconds
|
||||
GiveUp(C)
|
||||
return
|
||||
|
||||
//second, spin a sticky spiderweb on this tile
|
||||
var/obj/effect/spider/stickyweb/W = locate() in get_turf(src)
|
||||
if(!W)
|
||||
Web()
|
||||
//second, spin a sticky spiderweb on this tile
|
||||
var/obj/effect/spider/stickyweb/W = locate() in get_turf(src)
|
||||
if(!W)
|
||||
Web()
|
||||
else
|
||||
//third, lay an egg cluster there
|
||||
if(fed)
|
||||
LayEggs()
|
||||
else
|
||||
//third, lay an egg cluster there
|
||||
if(fed)
|
||||
LayEggs()
|
||||
else
|
||||
//fourthly, cocoon any nearby items so those pesky pinkskins can't use them
|
||||
for(var/obj/O in can_see)
|
||||
//fourthly, cocoon any nearby items so those pesky pinkskins can't use them
|
||||
for(var/obj/O in can_see)
|
||||
|
||||
if(O.anchored)
|
||||
continue
|
||||
if(O.anchored)
|
||||
continue
|
||||
|
||||
if(istype(O, /obj/item) || istype(O, /obj/structure) || istype(O, /obj/machinery))
|
||||
cocoon_target = O
|
||||
busy = MOVING_TO_TARGET
|
||||
stop_automated_movement = 1
|
||||
Goto(O, move_to_delay)
|
||||
//give up if we can't reach them after 10 seconds
|
||||
GiveUp(O)
|
||||
if(istype(O, /obj/item) || istype(O, /obj/structure) || istype(O, /obj/machinery))
|
||||
cocoon_target = O
|
||||
busy = MOVING_TO_TARGET
|
||||
stop_automated_movement = 1
|
||||
Goto(O, move_to_delay)
|
||||
//give up if we can't reach them after 10 seconds
|
||||
GiveUp(O)
|
||||
|
||||
else if(busy == MOVING_TO_TARGET && cocoon_target)
|
||||
if(get_dist(src, cocoon_target) <= 1)
|
||||
Wrap()
|
||||
else if(busy == MOVING_TO_TARGET && cocoon_target)
|
||||
if(get_dist(src, cocoon_target) <= 1)
|
||||
Wrap()
|
||||
|
||||
else
|
||||
busy = 0
|
||||
stop_automated_movement = 0
|
||||
else
|
||||
busy = 0
|
||||
stop_automated_movement = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/verb/Web()
|
||||
set name = "Lay Web"
|
||||
@@ -249,6 +241,8 @@
|
||||
var/obj/effect/spider/eggcluster/C = new /obj/effect/spider/eggcluster(src.loc)
|
||||
if(ckey)
|
||||
C.player_spiders = 1
|
||||
C.poison_type = poison_type
|
||||
C.poison_per_bite = poison_per_bite
|
||||
fed--
|
||||
busy = 0
|
||||
stop_automated_movement = 0
|
||||
@@ -262,4 +256,4 @@
|
||||
#undef SPINNING_WEB
|
||||
#undef LAYING_EGGS
|
||||
#undef MOVING_TO_TARGET
|
||||
#undef SPINNING_COCOON
|
||||
#undef SPINNING_COCOON
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#define EGG_INCUBATION_TIME 180
|
||||
#define EGG_INCUBATION_TIME 120
|
||||
|
||||
/mob/living/simple_animal/hostile/headcrab
|
||||
name = "Headslug"
|
||||
@@ -21,13 +21,15 @@
|
||||
var/datum/mind/origin
|
||||
var/egg_lain = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/human/victim)
|
||||
var/obj/item/body_egg/changeling_egg/egg = new(victim)
|
||||
/mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim)
|
||||
var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim)
|
||||
egg.Insert(victim)
|
||||
if(origin)
|
||||
egg.owner = origin
|
||||
egg.origin = origin
|
||||
else if(mind) // Let's make this a feature
|
||||
egg.owner = mind
|
||||
victim.internal_organs += egg
|
||||
egg.origin = mind
|
||||
for(var/obj/item/organ/internal/I in src)
|
||||
I.loc = egg
|
||||
visible_message("<span class='warning'>[src] lays an egg in a [victim].</span>")
|
||||
egg_lain = 1
|
||||
|
||||
@@ -35,9 +37,10 @@
|
||||
if(egg_lain)
|
||||
target.attack_animal(src)
|
||||
return
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
if(H.stat == DEAD)
|
||||
if(iscarbon(target) && !ismonkey(target))
|
||||
// Changeling egg can survive in aliens!
|
||||
var/mob/living/carbon/C = target
|
||||
if(C.stat == DEAD)
|
||||
Infect(target)
|
||||
src << "<span class='userdanger'>With your egg laid you feel your death rapidly approaching, time to die...</span>"
|
||||
spawn(100)
|
||||
@@ -48,32 +51,36 @@
|
||||
|
||||
|
||||
|
||||
/obj/item/body_egg/changeling_egg
|
||||
/obj/item/organ/internal/body_egg/changeling_egg
|
||||
name = "changeling egg"
|
||||
desc = "Twitching and disgusting"
|
||||
var/datum/mind/owner
|
||||
desc = "Twitching and disgusting."
|
||||
origin_tech = "biotech=7" // You need to be really lucky to obtain it.
|
||||
var/datum/mind/origin
|
||||
var/time
|
||||
var/used
|
||||
|
||||
/obj/item/body_egg/changeling_egg/egg_process()
|
||||
//Changeling eggs grow in dead people
|
||||
/obj/item/organ/internal/body_egg/changeling_egg/egg_process()
|
||||
// Changeling eggs grow in dead people
|
||||
time++
|
||||
if(time >= EGG_INCUBATION_TIME)
|
||||
Pop()
|
||||
Remove(owner)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/body_egg/changeling_egg/proc/Pop()
|
||||
if(!used)
|
||||
var/mob/living/carbon/monkey/M = new(affected_mob.loc)
|
||||
if(owner)
|
||||
owner.transfer_to(M)
|
||||
if(owner.changeling)
|
||||
owner.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null)
|
||||
M.key = owner.key
|
||||
if(ishuman(affected_mob))
|
||||
var/mob/living/carbon/human/H = affected_mob
|
||||
H.internal_organs.Remove(src)
|
||||
affected_mob.gib()
|
||||
used = 1
|
||||
qdel(src)
|
||||
/obj/item/organ/internal/body_egg/changeling_egg/proc/Pop()
|
||||
var/mob/living/carbon/monkey/M = new(owner)
|
||||
owner.stomach_contents += M
|
||||
|
||||
for(var/obj/item/organ/internal/I in src)
|
||||
I.Insert(M, 1)
|
||||
|
||||
if(!origin && owner.mind)
|
||||
origin = owner.mind
|
||||
|
||||
if(origin)
|
||||
origin.transfer_to(M)
|
||||
if(origin.changeling)
|
||||
origin.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null)
|
||||
M.key = origin.key
|
||||
owner.gib()
|
||||
|
||||
#undef EGG_INCUBATION_TIME
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
faction = list("hostile")
|
||||
stop_automated_movement_when_pulled = 0
|
||||
environment_smash = 1 //Set to 1 to break closets,tables,racks, etc; 2 for walls; 3 for rwalls
|
||||
var/stance = HOSTILE_STANCE_IDLE //Used to determine behavior
|
||||
var/atom/target
|
||||
var/ranged = 0
|
||||
var/rapid = 0
|
||||
@@ -32,37 +31,32 @@
|
||||
var/stat_exclusive = 0 //Mobs with this set to 1 will exclusively attack things defined by stat_attack, stat_attack 2 means they will only attack corpses
|
||||
var/attack_same = 0 //Set us to 1 to allow us to attack our own faction, or 2, to only ever attack our own faction
|
||||
|
||||
var/AIStatus = AI_ON //The Status of our AI, can be set to AI_ON (On, usual processing), AI_SLEEP (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever)
|
||||
var/AIStatus = AI_ON //The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever)
|
||||
|
||||
/mob/living/simple_animal/hostile/Life()
|
||||
|
||||
. = ..()
|
||||
if(ranged)
|
||||
ranged_cooldown--
|
||||
if(!.) //dead
|
||||
walk(src, 0) //stops walking
|
||||
return 0
|
||||
if(ranged)
|
||||
ranged_cooldown--
|
||||
if(client)
|
||||
|
||||
/mob/living/simple_animal/hostile/handle_automated_action()
|
||||
if(AIStatus == AI_OFF)
|
||||
return 0
|
||||
if(!AICanContinue())
|
||||
return 0
|
||||
if(!stat)
|
||||
switch(stance)
|
||||
if(HOSTILE_STANCE_IDLE)
|
||||
if(environment_smash)
|
||||
EscapeConfinement()
|
||||
FindTarget()
|
||||
var/list/possible_targets = ListTargets() //we look around for potential targets and make it a list for later use.
|
||||
|
||||
if(HOSTILE_STANCE_ATTACK)
|
||||
MoveToTarget()
|
||||
DestroySurroundings()
|
||||
if(environment_smash)
|
||||
EscapeConfinement()
|
||||
|
||||
if(AICanContinue(possible_targets))
|
||||
DestroySurroundings()
|
||||
if(!MoveToTarget(possible_targets)) //if we lose our target
|
||||
if(AIShouldSleep(possible_targets)) // we try to acquire a new one
|
||||
AIStatus = AI_IDLE // otherwise we go idle
|
||||
return 1
|
||||
|
||||
if(HOSTILE_STANCE_ATTACKING)
|
||||
AttackTarget()
|
||||
DestroySurroundings()
|
||||
|
||||
if(AIShouldSleep())
|
||||
AIStatus = AI_SLEEP
|
||||
|
||||
|
||||
//////////////HOSTILE MOB TARGETTING AND AGGRESSION////////////
|
||||
@@ -81,19 +75,18 @@
|
||||
L += Objects
|
||||
return L
|
||||
|
||||
/mob/living/simple_animal/hostile/proc/FindTarget()//Step 2, filter down possible targets to things we actually care about
|
||||
/mob/living/simple_animal/hostile/proc/FindTarget(var/list/possible_targets, var/HasTargetsList = 0)//Step 2, filter down possible targets to things we actually care about
|
||||
var/list/Targets = list()
|
||||
var/Target
|
||||
for(var/atom/A in ListTargets())
|
||||
if(!HasTargetsList)
|
||||
possible_targets = ListTargets()
|
||||
for(var/atom/A in possible_targets)
|
||||
if(Found(A))//Just in case people want to override targetting
|
||||
var/list/FoundTarget = list()
|
||||
FoundTarget += A
|
||||
Targets = FoundTarget
|
||||
Targets = list(A)
|
||||
break
|
||||
if(CanAttack(A))//Can we attack it?
|
||||
Targets += A
|
||||
continue
|
||||
Target = PickTarget(Targets)
|
||||
var/Target = PickTarget(Targets)
|
||||
GiveTarget(Target)
|
||||
return Target //We now have a target
|
||||
|
||||
@@ -101,14 +94,14 @@
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/proc/PickTarget(list/Targets)//Step 3, pick amongst the possible, attackable targets
|
||||
if(!Targets.len)//We didnt find nothin!
|
||||
return
|
||||
if(target != null)//If we already have a target, but are told to pick again, calculate the lowest distance between all possible, and pick from the lowest distance targets
|
||||
for(var/atom/A in Targets)
|
||||
var/target_dist = get_dist(src, target)
|
||||
var/possible_target_distance = get_dist(src, A)
|
||||
if(target_dist < possible_target_distance)
|
||||
Targets -= A
|
||||
if(!Targets.len)//We didnt find nothin!
|
||||
return
|
||||
var/chosen_target = pick(Targets)//Pick the remaining targets (if any) at random
|
||||
return chosen_target
|
||||
|
||||
@@ -150,15 +143,14 @@
|
||||
target = new_target
|
||||
if(target != null)
|
||||
Aggro()
|
||||
stance = HOSTILE_STANCE_ATTACK
|
||||
return
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/hostile/proc/MoveToTarget()//Step 5, handle movement between us and our target
|
||||
/mob/living/simple_animal/hostile/proc/MoveToTarget(var/list/possible_targets)//Step 5, handle movement between us and our target
|
||||
stop_automated_movement = 1
|
||||
if(!target || !CanAttack(target))
|
||||
LoseTarget()
|
||||
return
|
||||
if(target in ListTargets())
|
||||
return 0
|
||||
if(target in possible_targets)
|
||||
var/target_distance = get_dist(src,target)
|
||||
if(ranged)//We ranged? Shoot at em
|
||||
if(target_distance >= 2 && ranged_cooldown <= 0)//But make sure they're a tile away at least, and our range attack is off cooldown
|
||||
@@ -172,46 +164,33 @@
|
||||
Goto(target,move_to_delay,minimum_distance)
|
||||
if(isturf(loc) && target.Adjacent(src)) //If they're next to us, attack
|
||||
AttackingTarget()
|
||||
return
|
||||
return 1
|
||||
if(environment_smash)
|
||||
if(target.loc != null && get_dist(src, target.loc) <= vision_range)//We can't see our target, but he's in our vision range still
|
||||
if(environment_smash >= 2)//If we're capable of smashing through walls, forget about vision completely after finding our target
|
||||
Goto(target,move_to_delay,minimum_distance)
|
||||
FindHidden()
|
||||
return
|
||||
return 1
|
||||
else
|
||||
if(FindHidden())
|
||||
return
|
||||
return 1
|
||||
LoseTarget()
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/hostile/proc/Goto(target, delay, minimum_distance)
|
||||
walk_to(src, target, minimum_distance, delay)
|
||||
|
||||
/mob/living/simple_animal/hostile/adjustBruteLoss(damage)
|
||||
..(damage)
|
||||
if(!client && !stat && search_objects < 3)//Not unconscious, and we don't ignore mobs
|
||||
if(!ckey && !stat && search_objects < 3)//Not unconscious, and we don't ignore mobs
|
||||
if(search_objects)//Turn off item searching and ignore whatever item we were looking at, we're more concerned with fight or flight
|
||||
search_objects = 0
|
||||
target = null
|
||||
if(stance == HOSTILE_STANCE_IDLE)//If we took damage while idle, immediately attempt to find the source of it so we find a living target
|
||||
Aggro()
|
||||
if(AIStatus == AI_IDLE)
|
||||
AIStatus = AI_ON
|
||||
FindTarget()
|
||||
else if(target != null && prob(40))//No more pulling a mob forever and having a second player attack it, it can switch targets now if it finds a more suitable one
|
||||
FindTarget()
|
||||
if(stance == HOSTILE_STANCE_ATTACK)//No more pulling a mob forever and having a second player attack it, it can switch targets now if it finds a more suitable one
|
||||
if(target != null && prob(40))
|
||||
FindTarget()
|
||||
|
||||
/mob/living/simple_animal/hostile/proc/AttackTarget()
|
||||
|
||||
stop_automated_movement = 1
|
||||
if(!target || !CanAttack(target))
|
||||
LoseTarget()
|
||||
return 0
|
||||
if(!(target in ListTargets()))
|
||||
LoseTarget()
|
||||
return 0
|
||||
if(isturf(loc) && target.Adjacent(src))
|
||||
AttackingTarget()
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/hostile/proc/AttackingTarget()
|
||||
target.attack_animal(src)
|
||||
@@ -229,7 +208,6 @@
|
||||
taunt_chance = initial(taunt_chance)
|
||||
|
||||
/mob/living/simple_animal/hostile/proc/LoseTarget()
|
||||
stance = HOSTILE_STANCE_IDLE
|
||||
target = null
|
||||
walk(src, 0)
|
||||
LoseAggro()
|
||||
@@ -325,30 +303,16 @@
|
||||
|
||||
|
||||
////// AI Status ///////
|
||||
/mob/living/simple_animal/hostile/proc/AICanContinue()
|
||||
/mob/living/simple_animal/hostile/proc/AICanContinue(var/list/possible_targets)
|
||||
switch(AIStatus)
|
||||
if(AI_ON)
|
||||
. = 1
|
||||
if(AI_SLEEP)
|
||||
if(AIShouldWake())
|
||||
if(AI_IDLE)
|
||||
if(FindTarget(possible_targets, 1))
|
||||
. = 1
|
||||
AIStatus = AI_ON //Wake up for more than one Life() cycle.
|
||||
else
|
||||
. = 0
|
||||
if(AI_OFF)
|
||||
. = 0
|
||||
|
||||
|
||||
//Returns 1 if the AI should wake up
|
||||
//Returns 0 if the AI should remain asleep
|
||||
/mob/living/simple_animal/hostile/proc/AIShouldWake()
|
||||
. = 0
|
||||
if(FindTarget())
|
||||
. = 1
|
||||
|
||||
|
||||
//Convenience
|
||||
/mob/living/simple_animal/hostile/proc/AIShouldSleep()
|
||||
. = !(AIShouldWake())
|
||||
if(. && stance != HOSTILE_STANCE_IDLE) //This proc was called before LoseTarget().
|
||||
LoseTarget()
|
||||
/mob/living/simple_animal/hostile/proc/AIShouldSleep(var/list/possible_targets)
|
||||
return !FindTarget(possible_targets, 1)
|
||||
|
||||
@@ -87,16 +87,12 @@
|
||||
temperature = 50
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/basilisk/GiveTarget(new_target)
|
||||
target = new_target
|
||||
if(target != null)
|
||||
Aggro()
|
||||
stance = HOSTILE_STANCE_ATTACK
|
||||
if(..()) //we have a target
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(L.bodytemperature > 200)
|
||||
L.bodytemperature = 200
|
||||
visible_message("<span class='danger'>The [src.name]'s stare chills [L.name] to the bone!</span>")
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/basilisk/ex_act(severity, target)
|
||||
switch(severity)
|
||||
@@ -154,17 +150,14 @@
|
||||
if(target != null)
|
||||
if(istype(target, /obj/item/weapon/ore))
|
||||
visible_message("<span class='notice'>The [src.name] looks at [target.name] with hungry eyes.</span>")
|
||||
stance = HOSTILE_STANCE_ATTACK
|
||||
return
|
||||
if(isliving(target))
|
||||
|
||||
else if(isliving(target))
|
||||
Aggro()
|
||||
stance = HOSTILE_STANCE_ATTACK
|
||||
visible_message("<span class='danger'>The [src.name] tries to flee from [target.name]!</span>")
|
||||
retreat_distance = 10
|
||||
minimum_distance = 10
|
||||
Burrow()
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/AttackingTarget()
|
||||
if(istype(target, /obj/item/weapon/ore))
|
||||
@@ -366,7 +359,7 @@
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/proc/handle_preattack()
|
||||
if(ranged_cooldown <= 2 && !pre_attack)
|
||||
pre_attack++
|
||||
if(!pre_attack || stat || stance == HOSTILE_STANCE_IDLE)
|
||||
if(!pre_attack || stat || AIStatus == AI_IDLE)
|
||||
return
|
||||
icon_state = "Goliath_preattack"
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
/mob/living/simple_animal/hostile/morph/examine(mob/user)
|
||||
if(morphed)
|
||||
form.examine(user) // Refactor examine to return desc so it's static? Not sure if worth it
|
||||
if(get_dist(user,src)<=3)
|
||||
if(get_dist(user,src)<=3)
|
||||
user << "<span class='notice'>Looks odd!</span>"
|
||||
else
|
||||
..()
|
||||
@@ -61,7 +61,7 @@
|
||||
/mob/living/simple_animal/hostile/morph/proc/assume(atom/movable/target)
|
||||
morphed = 1
|
||||
form = target
|
||||
|
||||
|
||||
//anim(loc,src,'icons/mob/mob.dmi',,"morph",,src.dir) No effect better than shit effect
|
||||
|
||||
//Todo : update to .appearance once 508 hits
|
||||
@@ -89,9 +89,9 @@
|
||||
return
|
||||
morphed = 0
|
||||
form = null
|
||||
|
||||
//anim(loc,src,'icons/mob/mob.dmi',,"morph",,src.dir)
|
||||
|
||||
|
||||
//anim(loc,src,'icons/mob/mob.dmi',,"morph",,src.dir)
|
||||
|
||||
name = initial(name)
|
||||
icon = initial(icon)
|
||||
icon_state = initial(icon_state)
|
||||
@@ -127,7 +127,7 @@
|
||||
/mob/living/simple_animal/hostile/morph/LoseAggro()
|
||||
vision_range = idle_vision_range
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/AIShouldSleep()
|
||||
/mob/living/simple_animal/hostile/morph/AIShouldSleep(var/list/possible_targets)
|
||||
. = ..()
|
||||
if(.)
|
||||
var/list/things = list()
|
||||
@@ -160,6 +160,9 @@
|
||||
return
|
||||
target.attack_animal(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/update_action_buttons() //So all eaten objects are not counted every life
|
||||
return
|
||||
|
||||
//Spawn Event
|
||||
|
||||
/datum/round_event_control/morph
|
||||
|
||||
@@ -74,10 +74,10 @@
|
||||
health = Clamp(health, 0, maxHealth)
|
||||
|
||||
/mob/living/simple_animal/Life()
|
||||
if(..())
|
||||
if(!client && !stat)
|
||||
if(..()) //alive
|
||||
if(!ckey)
|
||||
handle_automated_movement()
|
||||
|
||||
handle_automated_action()
|
||||
handle_automated_speech()
|
||||
return 1
|
||||
|
||||
@@ -114,6 +114,9 @@
|
||||
if(druggy)
|
||||
druggy = 0
|
||||
|
||||
/mob/living/simple_animal/proc/handle_automated_action()
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/proc/handle_automated_movement()
|
||||
if(!stop_automated_movement && wander)
|
||||
if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc.
|
||||
@@ -254,7 +257,7 @@
|
||||
if(!Proj)
|
||||
return
|
||||
apply_damage(Proj.damage, Proj.damage_type)
|
||||
Proj.on_hit(src, 0)
|
||||
Proj.on_hit(src)
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/adjustFireLoss(amount)
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "daemon"
|
||||
icon_living = "daemon"
|
||||
speed = 0
|
||||
speed = 1
|
||||
a_intent = "harm"
|
||||
stop_automated_movement = 1
|
||||
status_flags = CANPUSH
|
||||
@@ -21,22 +21,26 @@
|
||||
minbodytemp = 0
|
||||
faction = list("slaughter")
|
||||
attacktext = "wildly tears into"
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
maxHealth = 200
|
||||
health = 200
|
||||
environment_smash = 1
|
||||
melee_damage_lower = 30
|
||||
melee_damage_upper = 30
|
||||
see_in_dark = 8
|
||||
var/boost = 0
|
||||
bloodcrawl = BLOODCRAWL_EAT
|
||||
see_invisible = SEE_INVISIBLE_MINIMUM
|
||||
var/devoured = 0
|
||||
var/phased = FALSE
|
||||
var/holder = null
|
||||
var/eating = FALSE
|
||||
var/mob/living/kidnapped = null
|
||||
var/playstyle_string = "<B>You are the Slaughter Demon, a terible creature from another existence. You have a single desire: To kill. \
|
||||
You may Ctrl+Click on blood pools to travel through them, appearing and dissaapearing from the station at will. \
|
||||
Pulling a dead or critical mob while you enter a pool will pull them in with you, allowing you to feast. </B>"
|
||||
Pulling a dead or critical mob while you enter a pool will pull them in with you, allowing you to feast. \
|
||||
You move quickly upon leaving a pool of blood, but the material world will soon sap your strength and leave you sluggish. </B>"
|
||||
|
||||
/mob/living/simple_animal/slaughter/Life()
|
||||
..()
|
||||
if(boost<world.time)
|
||||
speed = 1
|
||||
else
|
||||
speed = 0
|
||||
|
||||
/mob/living/simple_animal/slaughter/death()
|
||||
..(1)
|
||||
@@ -49,120 +53,10 @@
|
||||
return
|
||||
|
||||
|
||||
|
||||
////////////////////The Powers
|
||||
|
||||
/mob/living/simple_animal/slaughter/proc/phaseout(obj/effect/decal/cleanable/B)
|
||||
var/turf/mobloc = get_turf(src.loc)
|
||||
var/turf/bloodloc = get_turf(B.loc)
|
||||
if(Adjacent(bloodloc))
|
||||
src.notransform = TRUE
|
||||
spawn(0)
|
||||
src.visible_message("The [src] sinks into the pool of blood.")
|
||||
playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, 1, -1)
|
||||
var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter( mobloc )
|
||||
src.ExtinguishMob()
|
||||
if(src.buckled)
|
||||
src.buckled.unbuckle_mob()
|
||||
if(src.pulling)
|
||||
if(istype(src.pulling, /mob/living))
|
||||
var/mob/living/victim = src.pulling
|
||||
if(victim.stat == CONSCIOUS)
|
||||
src.visible_message("[victim] kicks free of the [src] at the last second!")
|
||||
else
|
||||
victim.loc = holder
|
||||
src.visible_message("<span class='warning'><B>The [src] drags [victim] into the pool of blood!</B>")
|
||||
src.kidnapped = victim
|
||||
src.loc = holder
|
||||
src.phased = TRUE
|
||||
src.holder = holder
|
||||
if(src.kidnapped)
|
||||
src << "<B>You begin to feast on [kidnapped]. You can not move while you are doing this.</B>"
|
||||
src.eating = TRUE
|
||||
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
|
||||
sleep(30)
|
||||
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
|
||||
sleep(30)
|
||||
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
|
||||
sleep(30)
|
||||
src << "<B>You devour [kidnapped]. Your health is fully restored.</B>"
|
||||
src.adjustBruteLoss(-1000)
|
||||
kidnapped.ghostize()
|
||||
qdel(kidnapped)
|
||||
src.devoured++
|
||||
src.kidnapped = null
|
||||
src.eating = FALSE
|
||||
src.notransform = 0
|
||||
|
||||
/mob/living/simple_animal/slaughter/proc/phasein(obj/effect/decal/cleanable/B)
|
||||
if(src.eating)
|
||||
src << "<B>Finish eating first!</B>"
|
||||
else
|
||||
src.loc = B.loc
|
||||
src.phased = FALSE
|
||||
src.client.eye = src
|
||||
src.visible_message("<span class='warning'><B>The [src] rises out of the pool of blood!</B>")
|
||||
playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
|
||||
qdel(src.holder)
|
||||
|
||||
/obj/effect/decal/cleanable/blood/CtrlClick(mob/user)
|
||||
/mob/living/simple_animal/slaughter/phasein()
|
||||
..()
|
||||
if(istype(user, /mob/living/simple_animal/slaughter))
|
||||
var/mob/living/simple_animal/slaughter/S = user
|
||||
if(S.phased)
|
||||
S.phasein(src)
|
||||
else
|
||||
S.phaseout(src)
|
||||
|
||||
|
||||
/obj/effect/decal/cleanable/trail_holder/CtrlClick(mob/user)
|
||||
..()
|
||||
if(istype(user, /mob/living/simple_animal/slaughter))
|
||||
var/mob/living/simple_animal/slaughter/S = user
|
||||
if(S.phased)
|
||||
S.phasein(src)
|
||||
else
|
||||
S.phaseout(src)
|
||||
|
||||
|
||||
|
||||
/turf/CtrlClick(var/mob/user)
|
||||
..()
|
||||
if(istype(user, /mob/living/simple_animal/slaughter))
|
||||
var/mob/living/simple_animal/slaughter/S = user
|
||||
for(var/obj/effect/decal/cleanable/B in src.contents)
|
||||
if(istype(B, /obj/effect/decal/cleanable/blood) || istype(B, /obj/effect/decal/cleanable/trail_holder))
|
||||
if(S.phased)
|
||||
S.phasein(B)
|
||||
break
|
||||
else
|
||||
S.phaseout(B)
|
||||
break
|
||||
|
||||
/obj/effect/dummy/slaughter //Can't use the wizard one, blocked by jaunt/slow
|
||||
name = "water"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "nothing"
|
||||
var/canmove = 1
|
||||
density = 0
|
||||
anchored = 1
|
||||
invisibility = 60
|
||||
|
||||
obj/effect/dummy/slaughter/relaymove(mob/user, direction)
|
||||
if (!src.canmove || !direction) return
|
||||
var/turf/newLoc = get_step(src,direction)
|
||||
loc = newLoc
|
||||
src.canmove = 0
|
||||
spawn(1)
|
||||
src.canmove = 1
|
||||
|
||||
/obj/effect/dummy/slaughter/ex_act(blah)
|
||||
return
|
||||
/obj/effect/dummy/slaughter/bullet_act(blah)
|
||||
return
|
||||
|
||||
/obj/effect/dummy/slaughter/singularity_act(blah)
|
||||
return
|
||||
speed = 0
|
||||
boost = world.time + 30
|
||||
|
||||
|
||||
//////////The Loot
|
||||
@@ -172,4 +66,11 @@ obj/effect/dummy/slaughter/relaymove(mob/user, direction)
|
||||
desc = "It's still faintly beating with rage"
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
icon_state = "heart-on"
|
||||
origin_tech = "combat=5;biotech=8"
|
||||
origin_tech = "combat=5;biotech=8"
|
||||
|
||||
/obj/item/weapon/demonheart/attack_self(mob/living/user)
|
||||
visible_message("[user] feasts upon the [src].")
|
||||
user << "You absorb some of the demon's power!"
|
||||
user.bloodcrawl = BLOODCRAWL
|
||||
qdel(src)
|
||||
|
||||
|
||||
@@ -36,9 +36,9 @@
|
||||
spawn_locs += L.loc
|
||||
if(!spawn_locs)
|
||||
return find_slaughter()
|
||||
var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(pick(spawn_locs))
|
||||
var /obj/effect/dummy/slaughter/holder = PoolOrNew(/obj/effect/dummy/slaughter,(pick(spawn_locs)))
|
||||
var/mob/living/simple_animal/slaughter/S = new /mob/living/simple_animal/slaughter/(holder)
|
||||
S.phased = TRUE
|
||||
S.holder = holder
|
||||
player_mind.transfer_to(S)
|
||||
player_mind.assigned_role = "Slaughter Demon"
|
||||
player_mind.special_role = "Slaughter Demon"
|
||||
@@ -64,4 +64,4 @@
|
||||
log_game("[key_of_slaughter] was spawned as a Slaughter Demon by an event.")
|
||||
return 0
|
||||
message_admins("Unfortunately, no candidates were available for becoming a Slaugter Demon. Shutting down.")
|
||||
return kill()
|
||||
return kill()
|
||||
|
||||
@@ -6,43 +6,41 @@
|
||||
//param = copytext(act, t1 + 1, length(act) + 1)
|
||||
act = copytext(act, 1, t1)
|
||||
|
||||
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
|
||||
act = copytext(act,1,length(act))
|
||||
|
||||
var/m_type = 1
|
||||
var/regenerate_icons
|
||||
var/message
|
||||
|
||||
switch(act) //Alphabetical please
|
||||
if("bounce")
|
||||
if("bounce","bounces")
|
||||
message = "<B>The [src.name]</B> bounces in place."
|
||||
m_type = 1
|
||||
|
||||
if("jiggle")
|
||||
if("jiggle","jiggles")
|
||||
message = "<B>The [src.name]</B> jiggles!"
|
||||
m_type = 1
|
||||
|
||||
if("light")
|
||||
if("light","lights")
|
||||
message = "<B>The [src.name]</B> lights up for a bit, then stops."
|
||||
m_type = 1
|
||||
|
||||
if("moan")
|
||||
if("moan","moans")
|
||||
message = "<B>The [src.name]</B> moans."
|
||||
m_type = 2
|
||||
|
||||
if("shiver")
|
||||
if("shiver","shivers")
|
||||
message = "<B>The [src.name]</B> shivers."
|
||||
m_type = 2
|
||||
|
||||
if("sway")
|
||||
if("sway","sways")
|
||||
message = "<B>The [src.name]</B> sways around dizzily."
|
||||
m_type = 1
|
||||
|
||||
if("twitch")
|
||||
if("twitch","twitches")
|
||||
message = "<B>The [src.name]</B> twitches."
|
||||
m_type = 1
|
||||
|
||||
if("vibrate")
|
||||
if("vibrate","vibrates")
|
||||
message = "<B>The [src.name]</B> vibrates!"
|
||||
m_type = 1
|
||||
|
||||
@@ -50,7 +48,7 @@
|
||||
mood = null
|
||||
regenerate_icons = 1
|
||||
|
||||
if("smile")
|
||||
if("smile","smiles")
|
||||
mood = "mischevous"
|
||||
regenerate_icons = 1
|
||||
|
||||
@@ -58,15 +56,15 @@
|
||||
mood = ":33"
|
||||
regenerate_icons = 1
|
||||
|
||||
if("pout")
|
||||
if("pout","pouts")
|
||||
mood = "pout"
|
||||
regenerate_icons = 1
|
||||
|
||||
if("frown")
|
||||
if("frown","frowns")
|
||||
mood = "sad"
|
||||
regenerate_icons = 1
|
||||
|
||||
if("scowl")
|
||||
if("scowl","scowls")
|
||||
mood = "angry"
|
||||
regenerate_icons = 1
|
||||
|
||||
|
||||
@@ -167,7 +167,7 @@
|
||||
attacked += 10
|
||||
if((Proj.damage_type == BURN))
|
||||
adjustBruteLoss(-abs(Proj.damage)) //fire projectiles heals slimes.
|
||||
Proj.on_hit(src, 0)
|
||||
Proj.on_hit(src)
|
||||
else
|
||||
..(Proj)
|
||||
return 0
|
||||
|
||||
@@ -946,6 +946,14 @@ var/list/slot_equipment_priority = list( \
|
||||
return G
|
||||
break
|
||||
|
||||
/mob/proc/notify_ghost_cloning(var/message = "Someone is trying to revive you. Re-enter your corpse if you want to be revived!", var/sound = 'sound/effects/genetics.ogg')
|
||||
var/mob/dead/observer/ghost = get_ghost()
|
||||
if(ghost)
|
||||
ghost.notify_cloning(message, sound)
|
||||
return ghost
|
||||
|
||||
|
||||
|
||||
/mob/proc/adjustEarDamage()
|
||||
return
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
return 0
|
||||
|
||||
/proc/iscorgi(A)
|
||||
if(istype(A, /mob/living/simple_animal/pet/corgi))
|
||||
if(istype(A, /mob/living/simple_animal/pet/dog/corgi))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -125,7 +125,7 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/proc/isorgan(A)
|
||||
/proc/islimb(A)
|
||||
if(istype(A, /obj/item/organ/limb))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -300,14 +300,11 @@
|
||||
|
||||
/mob/new_player/proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank)
|
||||
if (ticker.current_state == GAME_STATE_PLAYING)
|
||||
var/ailist[] = list()
|
||||
for (var/mob/living/silicon/ai/A in living_mob_list)
|
||||
ailist += A
|
||||
if (ailist.len)
|
||||
var/mob/living/silicon/ai/announcer = pick(ailist)
|
||||
if(announcement_systems.len)
|
||||
if(character.mind)
|
||||
if((character.mind.assigned_role != "Cyborg") && (character.mind.assigned_role != character.mind.special_role))
|
||||
announcer.say("[announcer.radiomod] [character.real_name] has signed up as [rank].")
|
||||
var/obj/machinery/announcement_system/announcer = pick(announcement_systems)
|
||||
announcer.announce("ARRIVAL", character.real_name, rank, list()) //make the list empty to make it announce it in common
|
||||
|
||||
/mob/new_player/proc/LateChoices()
|
||||
var/mills = world.time // 1/10 of a second, not real milliseconds but whatever
|
||||
|
||||
@@ -163,7 +163,7 @@
|
||||
else if(backbag == 2)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
|
||||
if(BARTENDER)
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "bar_suit_s")
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "barman_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_OVERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "armor"), ICON_OVERLAY)
|
||||
if(backbag == 1)
|
||||
|
||||
@@ -3,15 +3,18 @@
|
||||
return
|
||||
//Handle items on mob
|
||||
|
||||
//first implants
|
||||
//first implants & organs
|
||||
var/list/implants = list()
|
||||
var/list/int_organs = list()
|
||||
|
||||
if (tr_flags & TR_KEEPIMPLANTS)
|
||||
for(var/obj/item/weapon/implant/W in src)
|
||||
implants += W
|
||||
|
||||
if(tr_flags & TR_KEEPITEMS)
|
||||
for(var/obj/item/W in (src.contents-implants))
|
||||
unEquip(W)
|
||||
if (tr_flags & TR_KEEPORGANS)
|
||||
for(var/obj/item/organ/internal/I in internal_organs)
|
||||
int_organs += I
|
||||
I.Remove(src, 1)
|
||||
|
||||
//Make mob invisible and spawn animation
|
||||
regenerate_icons()
|
||||
@@ -70,6 +73,14 @@
|
||||
I.loc = O
|
||||
I.implanted = O
|
||||
|
||||
//re-add organs to new mob
|
||||
if(tr_flags & TR_KEEPORGANS)
|
||||
for(var/obj/item/organ/internal/I in O.internal_organs)
|
||||
qdel(I)
|
||||
|
||||
for(var/obj/item/organ/internal/I in int_organs)
|
||||
I.Insert(O, 1)
|
||||
|
||||
//transfer mind and delete old mob
|
||||
if(mind)
|
||||
mind.transfer_to(O)
|
||||
@@ -98,12 +109,19 @@
|
||||
return
|
||||
//Handle items on mob
|
||||
|
||||
//first implants
|
||||
//first implants & organs
|
||||
var/list/implants = list()
|
||||
var/list/int_organs = list()
|
||||
|
||||
if (tr_flags & TR_KEEPIMPLANTS)
|
||||
for(var/obj/item/weapon/implant/W in src)
|
||||
implants += W
|
||||
|
||||
if (tr_flags & TR_KEEPORGANS)
|
||||
for(var/obj/item/organ/internal/I in internal_organs)
|
||||
int_organs += I
|
||||
I.Remove(src, 1)
|
||||
|
||||
//now the rest
|
||||
if (tr_flags & TR_KEEPITEMS)
|
||||
for(var/obj/item/W in (src.contents-implants))
|
||||
@@ -187,6 +205,13 @@
|
||||
I.implanted = O
|
||||
O.sec_hud_set_implants()
|
||||
|
||||
if(tr_flags & TR_KEEPORGANS)
|
||||
for(var/obj/item/organ/internal/I in O.internal_organs)
|
||||
qdel(I)
|
||||
|
||||
for(var/obj/item/organ/internal/I in int_organs)
|
||||
I.Insert(O, 1)
|
||||
|
||||
if(mind)
|
||||
mind.transfer_to(O)
|
||||
O.a_intent = "help"
|
||||
@@ -430,7 +455,7 @@
|
||||
for(var/t in organs) //this really should not be necessary
|
||||
qdel(t)
|
||||
|
||||
var/mob/living/simple_animal/pet/corgi/new_corgi = new /mob/living/simple_animal/pet/corgi (loc)
|
||||
var/mob/living/simple_animal/pet/dog/corgi/new_corgi = new /mob/living/simple_animal/pet/dog/corgi (loc)
|
||||
new_corgi.a_intent = "harm"
|
||||
new_corgi.key = key
|
||||
|
||||
@@ -509,7 +534,7 @@
|
||||
//Good mobs!
|
||||
if(ispath(MP, /mob/living/simple_animal/pet/cat))
|
||||
return 1
|
||||
if(ispath(MP, /mob/living/simple_animal/pet/corgi))
|
||||
if(ispath(MP, /mob/living/simple_animal/pet/dog/corgi))
|
||||
return 1
|
||||
if(ispath(MP, /mob/living/simple_animal/crab))
|
||||
return 1
|
||||
|
||||
@@ -213,7 +213,5 @@ Contents:
|
||||
equip_to_slot_or_del(new /obj/item/weapon/tank/jetpack/carbondioxide(src), slot_back)
|
||||
|
||||
var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(src)
|
||||
E.imp_in = src
|
||||
E.implanted = 1
|
||||
E.implanted(src)
|
||||
E.implant(src)
|
||||
return 1
|
||||
|
||||
@@ -3,20 +3,22 @@
|
||||
|
||||
Contents:
|
||||
- Stealth Verbs
|
||||
- Stealth Icon Stuff
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/toggle_stealth()
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
if(!U)
|
||||
return
|
||||
if(s_active)
|
||||
cancel_stealth()
|
||||
else
|
||||
spawn(0)
|
||||
anim(U.loc,U,'icons/mob/mob.dmi',,"cloak",,U.dir)
|
||||
if(cell.charge <= 0)
|
||||
U << "<span class='warning'>You don't have enough power to enable Stealth!</span>"
|
||||
return
|
||||
s_active=!s_active
|
||||
U.alpha = 0
|
||||
animate(U, U.alpha = 0,time = 15)
|
||||
U.visible_message("<span class='warning'>[U.name] vanishes into thin air!</span>", \
|
||||
"<span class='notice'>You are now invisible to normal detection.</span>")
|
||||
return
|
||||
@@ -24,11 +26,11 @@ Contents:
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/proc/cancel_stealth()
|
||||
var/mob/living/carbon/human/U = affecting
|
||||
if(!U)
|
||||
return 0
|
||||
if(s_active)
|
||||
spawn(0)
|
||||
anim(U.loc,U,'icons/mob/mob.dmi',,"uncloak",,U.dir)
|
||||
s_active=!s_active
|
||||
U.alpha = 255
|
||||
animate(U, U.alpha = 255, time = 15)
|
||||
U.visible_message("<span class='warning'>[U.name] appears from thin air!</span>", \
|
||||
"<span class='notice'>You are now visible.</span>")
|
||||
return 1
|
||||
@@ -45,34 +47,3 @@ Contents:
|
||||
else
|
||||
affecting << "<span class='danger'>Stealth does not appear to work!</span>"
|
||||
|
||||
|
||||
//Allows the mob to grab a stealth icon.
|
||||
/mob/proc/NinjaStealthActive(atom/A)//A is the atom which we are using as the overlay.
|
||||
invisibility = INVISIBILITY_LEVEL_TWO//Set ninja invis to 2.
|
||||
var/icon/opacity_icon = new(A.icon, A.icon_state)
|
||||
var/icon/alpha_mask = getIconMask(src)
|
||||
var/icon/alpha_mask_2 = new('icons/effects/effects.dmi', "at_shield1")
|
||||
alpha_mask.AddAlphaMask(alpha_mask_2)
|
||||
opacity_icon.AddAlphaMask(alpha_mask)
|
||||
for(var/i=0,i<5,i++)//And now we add it as overlays. It's faster than creating an icon and then merging it.
|
||||
var/image/I = image("icon" = opacity_icon, "icon_state" = A.icon_state, "layer" = layer+0.8)//So it's above other stuff but below weapons and the like.
|
||||
switch(i)//Now to determine offset so the result is somewhat blurred.
|
||||
if(1)
|
||||
I.pixel_x -= 1
|
||||
if(2)
|
||||
I.pixel_x += 1
|
||||
if(3)
|
||||
I.pixel_y -= 1
|
||||
if(4)
|
||||
I.pixel_y += 1
|
||||
|
||||
overlays += I//And finally add the overlay.
|
||||
overlays += image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = layer+0.9)
|
||||
|
||||
//When ninja steal malfunctions.
|
||||
/mob/proc/NinjaStealthMalf()
|
||||
invisibility = 0//Set ninja invis to 0.
|
||||
overlays += image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = layer+0.9)
|
||||
playsound(loc, 'sound/effects/stealthoff.ogg', 75, 1)
|
||||
|
||||
|
||||
|
||||
@@ -83,7 +83,6 @@ Contents:
|
||||
cell.charge = 9000
|
||||
|
||||
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja/Destroy()
|
||||
if(affecting)
|
||||
affecting << browse(null, "window=hack spideros")
|
||||
|
||||
@@ -4,25 +4,27 @@
|
||||
set background = BACKGROUND_ENABLED
|
||||
|
||||
//Runs in the background while the suit is initialized.
|
||||
spawn while(cell.charge)
|
||||
//Requires charge or stealth to process.
|
||||
spawn while(cell.charge || s_active)
|
||||
|
||||
//Let's check for some safeties.
|
||||
if(s_initialized && !affecting)
|
||||
terminate()//Kills the suit and attached objects.
|
||||
if(!s_initialized)
|
||||
return//When turned off the proc stops.
|
||||
return
|
||||
|
||||
//Now let's do the normal processing.
|
||||
if(s_coold)
|
||||
s_coold--//Checks for ability s_cooldown first.
|
||||
if(cell.charge)
|
||||
if(s_coold)
|
||||
s_coold--//Checks for ability s_cooldown first.
|
||||
|
||||
var/A = s_cost//s_cost is the default energy cost each ntick, usually 5.
|
||||
if(s_active)//If stealth is active.
|
||||
A += s_acost
|
||||
cell.charge-=A
|
||||
var/A = s_cost//s_cost is the default energy cost each ntick, usually 5.
|
||||
if(s_active)//If stealth is active.
|
||||
A += s_acost
|
||||
cell.charge-=A
|
||||
|
||||
if(!cell.charge)
|
||||
if(cell.charge <= 0)
|
||||
cell.charge=0
|
||||
cancel_stealth()
|
||||
|
||||
sleep(10)//Checks every second.
|
||||
|
||||
|
||||
|
||||
@@ -122,12 +122,12 @@
|
||||
projectile_type = /obj/item/projectile/plasma
|
||||
select_name = "plasma burst"
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
delay = 10
|
||||
delay = 15
|
||||
e_cost = 25
|
||||
|
||||
/obj/item/ammo_casing/energy/plasma/adv
|
||||
projectile_type = /obj/item/projectile/plasma/adv
|
||||
delay = 8
|
||||
delay = 10
|
||||
e_cost = 10
|
||||
|
||||
/obj/item/ammo_casing/energy/wormhole
|
||||
|
||||
@@ -31,8 +31,9 @@
|
||||
var/turf/curloc = user.loc
|
||||
if (!istype(targloc) || !istype(curloc) || !BB)
|
||||
return 0
|
||||
if(targloc == curloc) //Fire the projectile
|
||||
user.bullet_act(BB)
|
||||
if(targloc == curloc)
|
||||
if(BB.original == user) //if we target ourselves we go straight to bullet_act()
|
||||
user.bullet_act(BB)
|
||||
del(BB)
|
||||
return 1
|
||||
BB.loc = get_turf(user)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
var/select = 1 //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next.
|
||||
var/can_charge = 1 //Can it be charged in a recharger?
|
||||
ammo_x_offset = 2
|
||||
var/shaded_charge = 0 //if this gun uses a stateful charge bar for more detail
|
||||
|
||||
/obj/item/weapon/gun/energy/emp_act(severity)
|
||||
power_supply.use(round(power_supply.charge / severity))
|
||||
@@ -87,9 +88,12 @@
|
||||
itemState += "[shot.select_name]"
|
||||
if(power_supply.charge < shot.e_cost)
|
||||
overlays += "[icon_state]_empty"
|
||||
ratio = 0
|
||||
for(var/i = ratio, i >= 1, i--)
|
||||
overlays += image(icon = icon, icon_state = iconState, pixel_x = ammo_x_offset * (i -1))
|
||||
else
|
||||
if(!shaded_charge)
|
||||
for(var/i = ratio, i >= 1, i--)
|
||||
overlays += image(icon = icon, icon_state = iconState, pixel_x = ammo_x_offset * (i -1))
|
||||
else
|
||||
overlays += image(icon = icon, icon_state = "[icon_state]_charge[ratio]")
|
||||
if(F)
|
||||
var/iconF = "flight"
|
||||
if(F.on)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
origin_tech = "combat=3;magnets=2"
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/lasergun)
|
||||
ammo_x_offset = 1
|
||||
|
||||
shaded_charge = 1
|
||||
|
||||
/obj/item/weapon/gun/energy/laser/practice
|
||||
name = "practice laser gun"
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
icon_state = "hoslaser"
|
||||
force = 10
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/electrode/hos, /obj/item/ammo_casing/energy/laser/hos, /obj/item/ammo_casing/energy/disabler)
|
||||
ammo_x_offset = 4
|
||||
|
||||
/obj/item/weapon/gun/energy/gun/dragnet
|
||||
name = "DRAGnet"
|
||||
|
||||
@@ -59,6 +59,6 @@
|
||||
/obj/item/weapon/gun/energy/pulse/pistol/m1911
|
||||
name = "\improper M1911-P"
|
||||
desc = "A compact pulse core in a classic handgun frame for Nanotrasen officers. It's not the size of the gun, it's the size of the hole it puts through people."
|
||||
icon_state = "m1911-p"
|
||||
icon_state = "m1911"
|
||||
item_state = "gun"
|
||||
cell_type = "/obj/item/weapon/stock_parts/cell/infinite"
|
||||
@@ -52,6 +52,7 @@
|
||||
origin_tech = "materials=2;biotech=3;powerstorage=3"
|
||||
modifystate = 1
|
||||
var/charge_tick = 0
|
||||
ammo_x_offset = 1
|
||||
|
||||
/obj/item/weapon/gun/energy/floragun/New()
|
||||
..()
|
||||
|
||||
@@ -60,19 +60,20 @@
|
||||
if(!isliving(target))
|
||||
return 0
|
||||
var/mob/living/L = target
|
||||
|
||||
var/organ_hit_text = ""
|
||||
if(L.has_limbs)
|
||||
organ_hit_text = " in \the [parse_zone(def_zone)]"
|
||||
if(suppressed)
|
||||
playsound(loc, hitsound, 5, 1, -1)
|
||||
L << "<span class='userdanger'>You're shot by \a [src][organ_hit_text]!</span>"
|
||||
else
|
||||
if(hitsound)
|
||||
var/volume = vol_by_damage()
|
||||
playsound(loc, hitsound, volume, 1, -1)
|
||||
L.visible_message("<span class='danger'>[L] is hit by \a [src][organ_hit_text]!</span>", \
|
||||
"<span class='userdanger'>[L] is hit by \a [src][organ_hit_text]!</span>") //X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter
|
||||
if(blocked != 100) // not completely blocked
|
||||
var/organ_hit_text = ""
|
||||
if(L.has_limbs)
|
||||
organ_hit_text = " in \the [parse_zone(def_zone)]"
|
||||
if(suppressed)
|
||||
playsound(loc, hitsound, 5, 1, -1)
|
||||
L << "<span class='userdanger'>You're shot by \a [src][organ_hit_text]!</span>"
|
||||
else
|
||||
if(hitsound)
|
||||
var/volume = vol_by_damage()
|
||||
playsound(loc, hitsound, volume, 1, -1)
|
||||
L.visible_message("<span class='danger'>[L] is hit by \a [src][organ_hit_text]!</span>", \
|
||||
"<span class='userdanger'>[L] is hit by \a [src][organ_hit_text]!</span>") //X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter
|
||||
L.on_hit(type)
|
||||
|
||||
var/reagent_note
|
||||
if(reagents && reagents.reagent_list)
|
||||
@@ -81,7 +82,6 @@
|
||||
reagent_note += R.id + " ("
|
||||
reagent_note += num2text(R.volume) + ") "
|
||||
|
||||
L.on_hit(type)
|
||||
add_logs(firer, L, "shot", src, reagent_note)
|
||||
return L.apply_effects(stun, weaken, paralyze, irradiate, stutter, slur, eyeblur, drowsy, blocked, stamina, jitter)
|
||||
|
||||
@@ -94,9 +94,10 @@
|
||||
/obj/item/projectile/Bump(atom/A, yes)
|
||||
if(!yes) //prevents double bumps.
|
||||
return
|
||||
if(A == firer || A == src)
|
||||
loc = A.loc
|
||||
return 0 //cannot shoot yourself
|
||||
if(firer)
|
||||
if(A == firer || (A == firer.loc && istype(A, /obj/mecha))) //cannot shoot yourself or your mech
|
||||
loc = A.loc
|
||||
return 0
|
||||
|
||||
var/distance = get_dist(get_turf(A), starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations.
|
||||
def_zone = ran_zone(def_zone, max(100-(7*distance), 5)) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use.
|
||||
@@ -134,7 +135,7 @@
|
||||
if((!( current ) || loc == current))
|
||||
current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z)
|
||||
step_towards(src, current)
|
||||
if((original && original.layer>=2.75) || ismob(original))
|
||||
if(original && (original.layer>=2.75) || ismob(original))
|
||||
if(loc == get_turf(original))
|
||||
if(!(original in permutated))
|
||||
Bump(original, 1)
|
||||
|
||||
@@ -125,19 +125,19 @@
|
||||
create_reagents(50)
|
||||
|
||||
/obj/item/projectile/bullet/dart/on_hit(atom/target, blocked = 0, hit_zone)
|
||||
var/deflect = 0
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/M = target
|
||||
if(M.can_inject(null,0,hit_zone)) // Pass the hit zone to see if it can inject by whether it hit the head or the body.
|
||||
..()
|
||||
reagents.trans_to(M, reagents.total_volume)
|
||||
return 1
|
||||
else
|
||||
deflect = 1
|
||||
target.visible_message("<span class='danger'>The [name] was deflected!</span>", \
|
||||
"<span class='userdanger'>You were protected against the [name]!</span>")
|
||||
if(!deflect)
|
||||
..()
|
||||
if(blocked != 100) // not completely blocked
|
||||
if(M.can_inject(null,0,hit_zone)) // Pass the hit zone to see if it can inject by whether it hit the head or the body.
|
||||
..()
|
||||
reagents.trans_to(M, reagents.total_volume)
|
||||
return 1
|
||||
else
|
||||
blocked = 100
|
||||
target.visible_message("<span class='danger'>The [name] was deflected!</span>", \
|
||||
"<span class='userdanger'>You were protected against the [name]!</span>")
|
||||
|
||||
..(target, blocked, hit_zone)
|
||||
flags &= ~NOREACT
|
||||
reagents.handle_reactions()
|
||||
return 1
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
damage = 10
|
||||
damage_type = BRUTE
|
||||
nodamage = 0
|
||||
flag = "magic"
|
||||
|
||||
/obj/item/projectile/magic/fireball/Range()
|
||||
var/mob/living/L = locate(/mob/living) in (range(src, 1) - firer)
|
||||
@@ -45,7 +44,6 @@
|
||||
damage = 0
|
||||
damage_type = OXY
|
||||
nodamage = 1
|
||||
flag = "magic"
|
||||
|
||||
/obj/item/projectile/magic/resurrection/on_hit(mob/living/carbon/target)
|
||||
. = ..()
|
||||
@@ -69,7 +67,6 @@
|
||||
damage = 0
|
||||
damage_type = OXY
|
||||
nodamage = 1
|
||||
flag = "magic"
|
||||
var/inner_tele_radius = 0
|
||||
var/outer_tele_radius = 6
|
||||
|
||||
@@ -93,7 +90,6 @@
|
||||
damage = 0
|
||||
damage_type = OXY
|
||||
nodamage = 1
|
||||
flag = "magic"
|
||||
|
||||
/obj/item/projectile/magic/door/on_hit(atom/target)
|
||||
. = ..()
|
||||
@@ -114,7 +110,6 @@
|
||||
damage = 0
|
||||
damage_type = BURN
|
||||
nodamage = 1
|
||||
flag = "magic"
|
||||
|
||||
/obj/item/projectile/magic/change/on_hit(atom/change)
|
||||
. = ..()
|
||||
@@ -205,7 +200,7 @@
|
||||
var/animal = pick("parrot","corgi","crab","pug","cat","mouse","chicken","cow","lizard","chick","fox","butterfly")
|
||||
switch(animal)
|
||||
if("parrot") new_mob = new /mob/living/simple_animal/parrot(M.loc)
|
||||
if("corgi") new_mob = new /mob/living/simple_animal/pet/corgi(M.loc)
|
||||
if("corgi") new_mob = new /mob/living/simple_animal/pet/dog/corgi(M.loc)
|
||||
if("crab") new_mob = new /mob/living/simple_animal/crab(M.loc)
|
||||
if("pug") new_mob = new /mob/living/simple_animal/pet/pug(M.loc)
|
||||
if("cat") new_mob = new /mob/living/simple_animal/pet/cat(M.loc)
|
||||
@@ -257,7 +252,6 @@
|
||||
damage = 0
|
||||
damage_type = BURN
|
||||
nodamage = 1
|
||||
flag = "magic"
|
||||
|
||||
/obj/item/projectile/magic/animate/Bump(atom/change)
|
||||
..()
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
name ="explosive bolt"
|
||||
icon_state= "bolter"
|
||||
damage = 50
|
||||
flag = "bullet"
|
||||
|
||||
/obj/item/projectile/bullet/gyro/on_hit(atom/target, blocked = 0)
|
||||
..()
|
||||
@@ -37,7 +36,6 @@
|
||||
desc = "USE A WEEL GUN"
|
||||
icon_state= "bolter"
|
||||
damage = 60
|
||||
flag = "bullet"
|
||||
|
||||
/obj/item/projectile/bullet/a40mm/on_hit(atom/target, blocked = 0)
|
||||
..()
|
||||
@@ -206,29 +204,31 @@ obj/item/projectile/kinetic/New()
|
||||
icon_state = "plasmacutter"
|
||||
damage_type = BRUTE
|
||||
damage = 5
|
||||
range = 1
|
||||
range = 3
|
||||
|
||||
/obj/item/projectile/plasma/New()
|
||||
var/turf/proj_turf = get_turf(src)
|
||||
if(!istype(proj_turf, /turf))
|
||||
return
|
||||
var/datum/gas_mixture/environment = proj_turf.return_air()
|
||||
var/pressure = environment.return_pressure()
|
||||
if(pressure < 30)
|
||||
name = "full strength plasma blast"
|
||||
damage *= 3
|
||||
range += 3
|
||||
if(environment)
|
||||
var/pressure = environment.return_pressure()
|
||||
if(pressure < 30)
|
||||
name = "full strength plasma blast"
|
||||
damage *= 3
|
||||
..()
|
||||
|
||||
/obj/item/projectile/plasma/on_hit(atom/target)
|
||||
. = ..()
|
||||
if(istype(target, /turf/simulated/mineral))
|
||||
var/turf/simulated/mineral/M = target
|
||||
M.gets_drilled(firer)
|
||||
return ..()
|
||||
range = max(range - 1, 1)
|
||||
return -1
|
||||
|
||||
/obj/item/projectile/plasma/adv
|
||||
range = 2
|
||||
range = 5
|
||||
|
||||
/obj/item/projectile/plasma/adv/mech
|
||||
damage = 10
|
||||
range = 3
|
||||
range = 6
|
||||
@@ -224,6 +224,42 @@
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/medicine/mine_salve
|
||||
name = "Miner's Salve"
|
||||
id = "mine_salve"
|
||||
description = "Slowly heals burn and brute damage, and causes subject to believe they are fully healed."
|
||||
reagent_state = LIQUID
|
||||
color = "#6D6374"
|
||||
metabolization_rate = 0.4 * REAGENTS_METABOLISM
|
||||
|
||||
/datum/reagent/medicine/mine_salve/on_mob_life(mob/living/M)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/N = M
|
||||
N.hal_screwyhud = 5
|
||||
M.adjustBruteLoss(-0.25*REM)
|
||||
M.adjustFireLoss(-0.25*REM)
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/medicine/mine_salve/reaction_mob(mob/living/M, method=TOUCH, volume, show_message = 1)
|
||||
if(iscarbon(M))
|
||||
if(method == TOUCH)
|
||||
if(show_message)
|
||||
M << "<span class='notice'>You feel your wounds knitting back together!</span>"
|
||||
if(method == INGEST)
|
||||
if(show_message)
|
||||
M << "<span class='notice'>That tasted horrible.</span>"
|
||||
M.AdjustStunned(2)
|
||||
M.AdjustWeakened(2)
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/medicine/mine_salve/on_mob_delete(mob/living/M)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/N = M
|
||||
N.hal_screwyhud = 0
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/synthflesh
|
||||
name = "Synthflesh"
|
||||
id = "synthflesh"
|
||||
@@ -614,11 +650,6 @@
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/medicine/strange_reagent/Topic(href, href_list)
|
||||
if(href_list["reenter"])
|
||||
var/mob/dead/observer/ghost = usr
|
||||
if(istype(ghost))
|
||||
ghost.reenter_corpse(ghost)
|
||||
|
||||
/datum/reagent/medicine/strange_reagent
|
||||
name = "Strange Reagent"
|
||||
@@ -633,14 +664,11 @@
|
||||
if(M.getBruteLoss() >= 100 || M.getFireLoss() >= 100)
|
||||
M.visible_message("<span class='warning'>[M]'s body convulses a bit, and then falls still once more.</span>")
|
||||
return
|
||||
var/mob/dead/observer/ghost = M.get_ghost()
|
||||
M.visible_message("<span class='warning'>[M]'s body convulses a bit.</span>")
|
||||
if(!M.suiciding && !(NOCLONE in M.mutations))
|
||||
if(!M)
|
||||
return
|
||||
if(ghost)
|
||||
ghost << "<span class='ghostalert'>Someone is trying to revive you. Re-enter your corpse if you want to be revived! <a href=?src=\ref[src];reenter=1>(Click to re-enter)</a></span>"
|
||||
ghost << sound('sound/effects/genetics.ogg')
|
||||
if(M.notify_ghost_cloning())
|
||||
spawn (100) //so the ghost has time to re-enter
|
||||
return
|
||||
else
|
||||
|
||||
@@ -253,6 +253,95 @@
|
||||
if(volume >= 1)
|
||||
T.MakeSlippery(2)
|
||||
|
||||
/datum/reagent/spraytan
|
||||
name = "Spray Tan"
|
||||
id = "spraytan"
|
||||
description = "A substance applied to the skin to darken the skin."
|
||||
color = "#FFC080" // rgb: 255, 196, 128 Bright orange
|
||||
metabolization_rate = 10 * REAGENTS_METABOLISM // very fast, so it can be applied rapidly. But this changes on an overdose
|
||||
overdose_threshold = 11 //Slightly more than one un-nozzled spraybottle.
|
||||
|
||||
/datum/reagent/spraytan/reaction_mob(mob/living/M, method=TOUCH, volume, show_message = 1)
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
if(method == TOUCH)
|
||||
var/mob/living/carbon/human/N = M
|
||||
if(N.dna.species.id == "human")
|
||||
switch(N.skin_tone)
|
||||
if("african1")
|
||||
N.skin_tone = "african2"
|
||||
if("indian")
|
||||
N.skin_tone = "african1"
|
||||
if("arab")
|
||||
N.skin_tone = "indian"
|
||||
if("asian2")
|
||||
N.skin_tone = "arab"
|
||||
if("asian1")
|
||||
N.skin_tone = "asian2"
|
||||
if("mediterranean")
|
||||
N.skin_tone = "african1"
|
||||
if("latino")
|
||||
N.skin_tone = "mediterranean"
|
||||
if("caucasian3")
|
||||
N.skin_tone = "mediterranean"
|
||||
if("caucasian2")
|
||||
N.skin_tone = pick("caucasian3", "latino")
|
||||
if("caucasian1")
|
||||
N.skin_tone = "caucasian2"
|
||||
if ("albino")
|
||||
N.skin_tone = "caucasian1"
|
||||
|
||||
if(MUTCOLORS in N.dna.species.specflags) //take current alien color and darken it slightly
|
||||
var/newcolor = ""
|
||||
var/len = length(N.dna.features["mcolor"])
|
||||
for(var/i=1, i<=len, i+=1)
|
||||
var/ascii = text2ascii(N.dna.features["mcolor"],i)
|
||||
switch(ascii)
|
||||
if(48) newcolor += "0"
|
||||
if(49 to 57) newcolor += ascii2text(ascii-1) //numbers 1 to 9
|
||||
if(97) newcolor += "9"
|
||||
if(98 to 102) newcolor += ascii2text(ascii-1) //letters b to f lowercase
|
||||
if(65) newcolor +="9"
|
||||
if(66 to 70) newcolor += ascii2text(ascii+31) //letters B to F - translates to lowercase
|
||||
else
|
||||
break
|
||||
N.dna.features["mcolor"] = newcolor
|
||||
N.regenerate_icons()
|
||||
N.update_body()
|
||||
|
||||
|
||||
|
||||
if(method == INGEST)
|
||||
if(show_message)
|
||||
M << "<span class='notice'>That tasted horrible.</span>"
|
||||
M.AdjustStunned(2)
|
||||
M.AdjustWeakened(2)
|
||||
..()
|
||||
|
||||
|
||||
/datum/reagent/spraytan/overdose_process(mob/living/M)
|
||||
metabolization_rate = 1 * REAGENTS_METABOLISM
|
||||
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/N = M
|
||||
if(N.dna.species.id == "human") // If they're human, turn em to the "orange" race, and give em spiky black hair
|
||||
N.skin_tone = "orange"
|
||||
N.hair_style = "Spiky"
|
||||
N.hair_color = "000"
|
||||
N.update_hair()
|
||||
if(MUTCOLORS in N.dna.species.specflags) //Aliens with custom colors simply get turned orange
|
||||
N.dna.features["mcolor"] = "f80"
|
||||
N.regenerate_icons()
|
||||
N.update_body()
|
||||
if(prob(7))
|
||||
if(N.w_uniform)
|
||||
M.visible_message(pick("<b>[M]</b>'s collar pops up without warning.</span>", "<b>[M]</b> flexes their arms."))
|
||||
else
|
||||
M.visible_message("<b>[M]</b> flexes their arms.")
|
||||
if(prob(10))
|
||||
M.say(pick("Check these sweet biceps bro!", "Deal with it.", "CHUG! CHUG! CHUG! CHUG!", "Winning!", "NERDS!", "My name is John and I hate every single one of you."))
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/reagent/slimetoxin
|
||||
name = "Mutation Toxin"
|
||||
id = "mutationtoxin"
|
||||
@@ -455,7 +544,7 @@
|
||||
if(volume >= 3)
|
||||
if(!istype(T, /turf/space))
|
||||
var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/greenglow(T)
|
||||
reagentdecal.reagents.add_reagent("uranium", volume)
|
||||
reagentdecal.reagents.add_reagent("radium", volume)
|
||||
|
||||
/datum/reagent/sterilizine
|
||||
name = "Sterilizine"
|
||||
|
||||
@@ -35,10 +35,9 @@
|
||||
/mob/living/simple_animal/hostile/syndicate/ranged,
|
||||
/mob/living/simple_animal/hostile/syndicate/ranged/space,
|
||||
/mob/living/simple_animal/hostile/alien/queen/large,
|
||||
/mob/living/simple_animal/hostile/retaliate,
|
||||
/mob/living/simple_animal/hostile/retaliate/clown,
|
||||
/mob/living/simple_animal/hostile/mushroom,
|
||||
/mob/living/simple_animal/hostile/asteroid,
|
||||
/mob/living/simple_animal/hostile/retaliate,
|
||||
/mob/living/simple_animal/hostile/asteroid/basilisk,
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub,
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath,
|
||||
@@ -50,7 +49,15 @@
|
||||
/mob/living/simple_animal/hostile/blob,
|
||||
/mob/living/simple_animal/ascendant_shadowling
|
||||
)//exclusion list for things you don't want the reaction to create.
|
||||
var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs
|
||||
var/list/meancritters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs
|
||||
var/list/nicecritters = list(/mob/living/simple_animal/crab,
|
||||
/mob/living/simple_animal/mouse,
|
||||
/mob/living/simple_animal/lizard,
|
||||
/mob/living/simple_animal/parrot,
|
||||
/mob/living/simple_animal/butterfly,
|
||||
/mob/living/simple_animal/cow,
|
||||
/mob/living/simple_animal/chicken) // and possible friendly mobs
|
||||
nicecritters += typesof(/mob/living/simple_animal/pet) - /mob/living/simple_animal/pet
|
||||
var/atom/A = holder.my_atom
|
||||
var/turf/T = get_turf(A)
|
||||
var/area/my_area = get_area(T)
|
||||
@@ -70,13 +77,22 @@
|
||||
for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
|
||||
C.flash_eyes()
|
||||
for(var/i = 1, i <= amount_to_spawn, i++)
|
||||
var/chosen = pick(critters)
|
||||
var/mob/living/simple_animal/hostile/C = new chosen
|
||||
C.faction |= mob_faction
|
||||
C.loc = get_turf(holder.my_atom)
|
||||
if(prob(50))
|
||||
for(var/j = 1, j <= rand(1, 3), j++)
|
||||
step(C, pick(NORTH,SOUTH,EAST,WEST))
|
||||
if (reaction_name == "Friendly Gold Slime")
|
||||
var/chosen = pick(nicecritters)
|
||||
var/mob/living/simple_animal/C = new chosen
|
||||
C.faction |= mob_faction
|
||||
C.loc = get_turf(holder.my_atom)
|
||||
if(prob(50))
|
||||
for(var/j = 1, j <= rand(1, 3), j++)
|
||||
step(C, pick(NORTH,SOUTH,EAST,WEST))
|
||||
else
|
||||
var/chosen = pick(meancritters)
|
||||
var/mob/living/simple_animal/hostile/C = new chosen
|
||||
C.faction |= mob_faction
|
||||
C.loc = get_turf(holder.my_atom)
|
||||
if(prob(50))
|
||||
for(var/j = 1, j <= rand(1, 3), j++)
|
||||
step(C, pick(NORTH,SOUTH,EAST,WEST))
|
||||
|
||||
/datum/chemical_reaction/proc/goonchem_vortex(turf/simulated/T, setting_type, range)
|
||||
for(var/atom/movable/X in orange(range, T))
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user