Merge branch 'master' into upstream-merge-31044
This commit is contained in:
@@ -32,10 +32,10 @@
|
||||
new_player_panel()
|
||||
client.playtitlemusic()
|
||||
if(SSticker.current_state < GAME_STATE_SETTING_UP)
|
||||
var/tl = round(SSticker.GetTimeLeft(), 1)/10
|
||||
var/tl = SSticker.GetTimeLeft()
|
||||
var/postfix
|
||||
if(tl >= 0)
|
||||
postfix = "in about [tl] seconds"
|
||||
if(tl > 0)
|
||||
postfix = "in about [DisplayTimeText(tl)]"
|
||||
else
|
||||
postfix = "soon"
|
||||
to_chat(src, "Please set up your character and select \"Ready\". The game will start [postfix].")
|
||||
|
||||
@@ -392,12 +392,7 @@
|
||||
|
||||
|
||||
/mob/dead/new_player/proc/LateChoices()
|
||||
var/mills = world.time - SSticker.round_start_time // 1/10 of a second, not real milliseconds but whatever
|
||||
//var/secs = ((mills % 36000) % 600) / 10 //Not really needed, but I'll leave it here for refrence.. or something
|
||||
var/mins = (mills % 36000) / 600
|
||||
var/hours = mills / 36000
|
||||
|
||||
var/dat = "<div class='notice'>Round Duration: [round(hours)]h [round(mins)]m</div>"
|
||||
var/dat = "<div class='notice'>Round Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]</div>"
|
||||
|
||||
if(SSshuttle.emergency)
|
||||
switch(SSshuttle.emergency.mode)
|
||||
|
||||
@@ -67,30 +67,317 @@
|
||||
/datum/sprite_accessory/hair
|
||||
icon = 'icons/mob/human_face.dmi' // default icon for all hairs
|
||||
|
||||
/datum/sprite_accessory/hair/short
|
||||
name = "Short Hair" // try to capatilize the names please~ // try to spell
|
||||
icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you
|
||||
//Place in order by major style E.G "Afro, Bun, Ponytail"
|
||||
//Place different versions under the same style E.G "Bun > Large Bun, Ponytail > Long Ponytail"
|
||||
//A
|
||||
|
||||
/datum/sprite_accessory/hair/shorthair2
|
||||
name = "Short Hair 2"
|
||||
icon_state = "hair_shorthair2"
|
||||
/datum/sprite_accessory/hair/afro
|
||||
name = "Afro" // try to capatilize the names please~ // try to spell
|
||||
icon_state = "hair_afro" // you do not need to define _s or _l sub-states, game automatically does this for you
|
||||
|
||||
/datum/sprite_accessory/hair/shorthair3
|
||||
name = "Short Hair 3"
|
||||
icon_state = "hair_shorthair3"
|
||||
/datum/sprite_accessory/hair/afro2
|
||||
name = "Afro 2"
|
||||
icon_state = "hair_afro2"
|
||||
|
||||
/datum/sprite_accessory/hair/afro_large
|
||||
name = "Big Afro"
|
||||
icon_state = "hair_bigafro"
|
||||
|
||||
/datum/sprite_accessory/hair/antenna
|
||||
name = "Ahoge"
|
||||
icon_state = "hair_antenna"
|
||||
//B
|
||||
|
||||
/datum/sprite_accessory/hair/bald
|
||||
name = "Bald"
|
||||
icon_state = null
|
||||
|
||||
/datum/sprite_accessory/hair/balding
|
||||
name = "Balding Hair"
|
||||
icon_state = "hair_e"
|
||||
|
||||
/datum/sprite_accessory/hair/longbangs
|
||||
name = "Long Bangs"
|
||||
icon_state = "hair_lbangs"
|
||||
|
||||
/datum/sprite_accessory/hair/bedhead
|
||||
name = "Bedhead"
|
||||
icon_state = "hair_bedhead"
|
||||
|
||||
/datum/sprite_accessory/hair/bedhead2
|
||||
name = "Bedhead 2"
|
||||
icon_state = "hair_bedheadv2"
|
||||
|
||||
/datum/sprite_accessory/hair/bedhead3
|
||||
name = "Bedhead 3"
|
||||
icon_state = "hair_bedheadv3"
|
||||
|
||||
/datum/sprite_accessory/hair/beehive
|
||||
name = "Beehive"
|
||||
icon_state = "hair_beehive"
|
||||
|
||||
/datum/sprite_accessory/hair/beehive2
|
||||
name = "Beehive 2"
|
||||
icon_state = "hair_beehivev2"
|
||||
|
||||
/datum/sprite_accessory/hair/bob
|
||||
name = "Bob"
|
||||
icon_state = "hair_bobcut"
|
||||
|
||||
/datum/sprite_accessory/hair/bobcurl
|
||||
name = "Bobcurl"
|
||||
icon_state = "hair_bobcurl"
|
||||
|
||||
/datum/sprite_accessory/hair/bob
|
||||
name = "Bob Hair"
|
||||
icon_state = "hair_bob"
|
||||
|
||||
/datum/sprite_accessory/hair/bob2
|
||||
name = "Bob Hair 2"
|
||||
icon_state = "hair_bob2"
|
||||
|
||||
/datum/sprite_accessory/hair/boddicker
|
||||
name = "Boddicker"
|
||||
icon_state = "hair_boddicker"
|
||||
|
||||
/datum/sprite_accessory/hair/bowl
|
||||
name = "Bowl"
|
||||
icon_state = "hair_bowlcut"
|
||||
|
||||
/datum/sprite_accessory/hair/braided
|
||||
name = "Braided"
|
||||
icon_state = "hair_braided"
|
||||
|
||||
/datum/sprite_accessory/hair/front_braid
|
||||
name = "Braided front"
|
||||
icon_state = "hair_braidfront"
|
||||
|
||||
/datum/sprite_accessory/hair/braidtail
|
||||
name = "Braided Tail"
|
||||
icon_state = "hair_braidtail"
|
||||
|
||||
/datum/sprite_accessory/hair/lowbraid
|
||||
name = "Low Braid"
|
||||
icon_state = "hair_hbraid"
|
||||
|
||||
/datum/sprite_accessory/hair/not_floorlength_braid
|
||||
name = "High Braid"
|
||||
icon_state = "hair_braid2"
|
||||
|
||||
/datum/sprite_accessory/hair/shortbraid
|
||||
name = "Short Braid"
|
||||
icon_state = "hair_shortbraid"
|
||||
|
||||
/datum/sprite_accessory/hair/braid
|
||||
name = "Floorlength Braid"
|
||||
icon_state = "hair_braid"
|
||||
|
||||
/datum/sprite_accessory/hair/business
|
||||
name = "Business Hair"
|
||||
icon_state = "hair_business"
|
||||
|
||||
/datum/sprite_accessory/hair/business2
|
||||
name = "Business Hair 2"
|
||||
icon_state = "hair_business2"
|
||||
|
||||
/datum/sprite_accessory/hair/business3
|
||||
name = "Business Hair 3"
|
||||
icon_state = "hair_business3"
|
||||
|
||||
/datum/sprite_accessory/hair/business4
|
||||
name = "Business Hair 4"
|
||||
icon_state = "hair_business4"
|
||||
|
||||
/datum/sprite_accessory/hair/bun
|
||||
name = "Bun Head"
|
||||
icon_state = "hair_bun"
|
||||
|
||||
/datum/sprite_accessory/hair/bun2
|
||||
name = "Bun Head 2"
|
||||
icon_state = "hair_bunhead2"
|
||||
|
||||
/datum/sprite_accessory/hair/largebun
|
||||
name = "Large Bun"
|
||||
icon_state = "hair_largebun"
|
||||
|
||||
/datum/sprite_accessory/hair/buzz
|
||||
name = "Buzzcut"
|
||||
icon_state = "hair_buzzcut"
|
||||
|
||||
//C
|
||||
|
||||
/datum/sprite_accessory/hair/crew
|
||||
name = "Crewcut"
|
||||
icon_state = "hair_crewcut"
|
||||
|
||||
/datum/sprite_accessory/hair/combover
|
||||
name = "Combover"
|
||||
icon_state = "hair_combover"
|
||||
|
||||
/datum/sprite_accessory/hair/curls
|
||||
name = "Curls"
|
||||
icon_state = "hair_curls"
|
||||
|
||||
//D
|
||||
|
||||
/datum/sprite_accessory/hair/devillock
|
||||
name = "Devil Lock"
|
||||
icon_state = "hair_devilock"
|
||||
|
||||
/datum/sprite_accessory/hair/dreadlocks
|
||||
name = "Dreadlocks"
|
||||
icon_state = "hair_dreads"
|
||||
|
||||
/datum/sprite_accessory/hair/drillhair
|
||||
name = "Drill Hair"
|
||||
icon_state = "hair_drillhair"
|
||||
|
||||
//E
|
||||
|
||||
/datum/sprite_accessory/hair/emo
|
||||
name = "Emo"
|
||||
icon_state = "hair_emo"
|
||||
|
||||
/datum/sprite_accessory/hair/longemo
|
||||
name = "Long Emo"
|
||||
icon_state = "hair_longemo"
|
||||
|
||||
//F
|
||||
|
||||
/datum/sprite_accessory/hair/feather
|
||||
name = "Feather"
|
||||
icon_state = "hair_feather"
|
||||
|
||||
/datum/sprite_accessory/hair/sargeant
|
||||
name = "Flat Top"
|
||||
icon_state = "hair_sargeant"
|
||||
|
||||
/datum/sprite_accessory/hair/bigflattop
|
||||
name = "Big Flat Top"
|
||||
icon_state = "hair_bigflattop"
|
||||
|
||||
/datum/sprite_accessory/hair/fag
|
||||
name = "Flow Hair"
|
||||
icon_state = "hair_f"
|
||||
|
||||
/datum/sprite_accessory/hair/longfringe
|
||||
name = "Long Fringe"
|
||||
icon_state = "hair_longfringe"
|
||||
|
||||
/datum/sprite_accessory/hair/longestalt
|
||||
name = "Longer Fringe"
|
||||
icon_state = "hair_vlongfringe"
|
||||
|
||||
//G
|
||||
|
||||
/datum/sprite_accessory/hair/gelled
|
||||
name = "Gelled Back"
|
||||
icon_state = "hair_gelled"
|
||||
|
||||
/datum/sprite_accessory/hair/gentle
|
||||
name = "Gentle"
|
||||
icon_state = "hair_gentle"
|
||||
|
||||
//H
|
||||
|
||||
/datum/sprite_accessory/hair/cut
|
||||
name = "Cut Hair"
|
||||
icon_state = "hair_c"
|
||||
|
||||
/datum/sprite_accessory/hair/long
|
||||
name = "Shoulder-length Hair"
|
||||
icon_state = "hair_b"
|
||||
/datum/sprite_accessory/hair/halfbang
|
||||
name = "Half-banged Hair"
|
||||
icon_state = "hair_halfbang"
|
||||
|
||||
/datum/sprite_accessory/hair/halfbang2
|
||||
name = "Half-banged Hair 2"
|
||||
icon_state = "hair_halfbang2"
|
||||
|
||||
/datum/sprite_accessory/hair/hedgehog
|
||||
name = "Hedgehog Hair"
|
||||
icon_state = "hair_hedgehog"
|
||||
|
||||
/datum/sprite_accessory/hair/hitop
|
||||
name = "Hitop"
|
||||
icon_state = "hair_hitop"
|
||||
|
||||
/datum/sprite_accessory/hair/himecut
|
||||
name = "Hime Cut"
|
||||
icon_state = "hair_himecut"
|
||||
|
||||
/datum/sprite_accessory/hair/himecut2
|
||||
name = "Hime Cut 2"
|
||||
icon_state = "hair_himecut2"
|
||||
|
||||
/datum/sprite_accessory/hair/himeup
|
||||
name = "Hime Updo"
|
||||
icon_state = "hair_himeup"
|
||||
|
||||
//I
|
||||
|
||||
//J
|
||||
|
||||
/datum/sprite_accessory/hair/jensen
|
||||
name = "Jensen Hair"
|
||||
icon_state = "hair_jensen"
|
||||
|
||||
//K
|
||||
|
||||
/datum/sprite_accessory/hair/keanu
|
||||
name = "Keanu Hair"
|
||||
icon_state = "hair_keanu"
|
||||
|
||||
/datum/sprite_accessory/hair/kusangi
|
||||
name = "Kusanagi Hair"
|
||||
icon_state = "hair_kusanagi"
|
||||
|
||||
//L
|
||||
|
||||
/datum/sprite_accessory/hair/longer
|
||||
name = "Long Hair"
|
||||
icon_state = "hair_vlong"
|
||||
|
||||
/datum/sprite_accessory/hair/long
|
||||
name = "Long Hair 1"
|
||||
icon_state = "hair_long"
|
||||
|
||||
/datum/sprite_accessory/hair/long2
|
||||
name = "Long Hair 2"
|
||||
icon_state = "hair_long2"
|
||||
|
||||
/datum/sprite_accessory/hair/longest
|
||||
name = "Very Long Hair"
|
||||
icon_state = "hair_longest"
|
||||
|
||||
//M
|
||||
|
||||
/datum/sprite_accessory/hair/megaeyebrows
|
||||
name = "Mega Eyebrows"
|
||||
icon_state = "hair_megaeyebrows"
|
||||
|
||||
/datum/sprite_accessory/hair/messy
|
||||
name = "Messy"
|
||||
icon_state = "hair_messy"
|
||||
|
||||
/datum/sprite_accessory/hair/mohawk
|
||||
name = "Mohawk"
|
||||
icon_state = "hair_d"
|
||||
|
||||
/datum/sprite_accessory/hair/reversemohawk
|
||||
name = "Reverse Mohawk"
|
||||
icon_state = "hair_reversemohawk"
|
||||
|
||||
//N
|
||||
|
||||
//O
|
||||
|
||||
/datum/sprite_accessory/hair/odango
|
||||
name = "Odango"
|
||||
icon_state = "hair_odango"
|
||||
|
||||
/datum/sprite_accessory/hair/ombre
|
||||
name = "Ombre"
|
||||
icon_state = "hair_ombre"
|
||||
|
||||
/datum/sprite_accessory/hair/over_eye
|
||||
name = "Over Eye"
|
||||
icon_state = "hair_shortovereye"
|
||||
@@ -103,29 +390,39 @@
|
||||
name = "Very Long Over Eye"
|
||||
icon_state = "hair_longest2"
|
||||
|
||||
/datum/sprite_accessory/hair/longest
|
||||
name = "Very Long Hair"
|
||||
icon_state = "hair_longest"
|
||||
//P
|
||||
|
||||
/datum/sprite_accessory/hair/longfringe
|
||||
name = "Long Fringe"
|
||||
icon_state = "hair_longfringe"
|
||||
/datum/sprite_accessory/hair/parted
|
||||
name = "Parted"
|
||||
icon_state = "hair_parted"
|
||||
|
||||
/datum/sprite_accessory/hair/longestalt
|
||||
name = "Longer Fringe"
|
||||
icon_state = "hair_vlongfringe"
|
||||
/datum/sprite_accessory/hair/sidepartlongalt
|
||||
name = "Long Side Part"
|
||||
icon_state = "hair_longsidepart"
|
||||
|
||||
/datum/sprite_accessory/hair/gentle
|
||||
name = "Gentle"
|
||||
icon_state = "hair_gentle"
|
||||
/datum/sprite_accessory/hair/kagami
|
||||
name = "Pigtails"
|
||||
icon_state = "hair_kagami"
|
||||
|
||||
/datum/sprite_accessory/hair/halfbang
|
||||
name = "Half-banged Hair"
|
||||
icon_state = "hair_halfbang"
|
||||
/datum/sprite_accessory/hair/pigtail
|
||||
name = "Pigtails 2"
|
||||
icon_state = "hair_pigtails"
|
||||
|
||||
/datum/sprite_accessory/hair/halfbang2
|
||||
name = "Half-banged Hair 2"
|
||||
icon_state = "hair_halfbang2"
|
||||
/datum/sprite_accessory/hair/pigtail
|
||||
name = "Pigtails 3"
|
||||
icon_state = "hair_pigtails2"
|
||||
|
||||
/datum/sprite_accessory/hair/pixie
|
||||
name = "Pixie Cut"
|
||||
icon_state = "hair_pixie"
|
||||
|
||||
/datum/sprite_accessory/hair/pompadour
|
||||
name = "Pompadour"
|
||||
icon_state = "hair_pompadour"
|
||||
|
||||
/datum/sprite_accessory/hair/bigpompadour
|
||||
name = "Big Pompadour"
|
||||
icon_state = "hair_bigpompadour"
|
||||
|
||||
/datum/sprite_accessory/hair/ponytail1
|
||||
name = "Ponytail"
|
||||
@@ -147,6 +444,36 @@
|
||||
name = "Ponytail 5"
|
||||
icon_state = "hair_ponytail5"
|
||||
|
||||
/datum/sprite_accessory/hair/highponytail
|
||||
name = "High Ponytail"
|
||||
icon_state = "hair_highponytail"
|
||||
|
||||
/datum/sprite_accessory/hair/longponytail
|
||||
name = "Long Ponytail"
|
||||
icon_state = "hair_longstraightponytail"
|
||||
|
||||
//Q
|
||||
|
||||
/datum/sprite_accessory/hair/quiff
|
||||
name = "Quiff"
|
||||
icon_state = "hair_quiff"
|
||||
|
||||
|
||||
//R
|
||||
|
||||
//S
|
||||
|
||||
/datum/sprite_accessory/hair/oneshoulder
|
||||
name = "One Shoulder"
|
||||
icon_state = "hair_oneshoulder"
|
||||
|
||||
/datum/sprite_accessory/hair/tressshoulder
|
||||
name = "Tress Shoulder"
|
||||
icon_state = "hair_tressshoulder"
|
||||
|
||||
/datum/sprite_accessory/hair/sidecut
|
||||
name = "Sidecut"
|
||||
icon_state = "hair_sidecut"
|
||||
|
||||
/datum/sprite_accessory/hair/sidetail
|
||||
name = "Side Pony"
|
||||
@@ -164,141 +491,33 @@
|
||||
name = "Side Pony 4"
|
||||
icon_state = "hair_sidetail4"
|
||||
|
||||
/datum/sprite_accessory/hair/oneshoulder
|
||||
name = "One Shoulder"
|
||||
icon_state = "hair_oneshoulder"
|
||||
/datum/sprite_accessory/hair/short
|
||||
name = "Short Hair"
|
||||
icon_state = "hair_a"
|
||||
|
||||
/datum/sprite_accessory/hair/tressshoulder
|
||||
name = "Tress Shoulder"
|
||||
icon_state = "hair_tressshoulder"
|
||||
/datum/sprite_accessory/hair/shorthair2
|
||||
name = "Short Hair 2"
|
||||
icon_state = "hair_shorthair2"
|
||||
|
||||
/datum/sprite_accessory/hair/shorthair3
|
||||
name = "Short Hair 3"
|
||||
icon_state = "hair_shorthair3"
|
||||
|
||||
/datum/sprite_accessory/hair/long
|
||||
name = "Shoulder-length Hair"
|
||||
icon_state = "hair_b"
|
||||
|
||||
/datum/sprite_accessory/hair/parted
|
||||
name = "Parted"
|
||||
icon_state = "hair_parted"
|
||||
name = "Side Part"
|
||||
icon_state = "hair_part"
|
||||
|
||||
/datum/sprite_accessory/hair/pompadour
|
||||
name = "Pompadour"
|
||||
icon_state = "hair_pompadour"
|
||||
/datum/sprite_accessory/hair/skinhead
|
||||
name = "Skinhead"
|
||||
icon_state = "hair_skinhead"
|
||||
|
||||
/datum/sprite_accessory/hair/bigpompadour
|
||||
name = "Big Pompadour"
|
||||
icon_state = "hair_bigpompadour"
|
||||
|
||||
/datum/sprite_accessory/hair/quiff
|
||||
name = "Quiff"
|
||||
icon_state = "hair_quiff"
|
||||
|
||||
/datum/sprite_accessory/hair/bedhead
|
||||
name = "Bedhead"
|
||||
icon_state = "hair_bedhead"
|
||||
|
||||
/datum/sprite_accessory/hair/bedhead2
|
||||
name = "Bedhead 2"
|
||||
icon_state = "hair_bedheadv2"
|
||||
|
||||
/datum/sprite_accessory/hair/bedhead3
|
||||
name = "Bedhead 3"
|
||||
icon_state = "hair_bedheadv3"
|
||||
|
||||
/datum/sprite_accessory/hair/messy
|
||||
name = "Messy"
|
||||
icon_state = "hair_messy"
|
||||
|
||||
/datum/sprite_accessory/hair/beehive
|
||||
name = "Beehive"
|
||||
icon_state = "hair_beehive"
|
||||
|
||||
/datum/sprite_accessory/hair/beehive2
|
||||
name = "Beehive 2"
|
||||
icon_state = "hair_beehivev2"
|
||||
|
||||
/datum/sprite_accessory/hair/bobcurl
|
||||
name = "Bobcurl"
|
||||
icon_state = "hair_bobcurl"
|
||||
|
||||
/datum/sprite_accessory/hair/bob
|
||||
name = "Bob"
|
||||
icon_state = "hair_bobcut"
|
||||
|
||||
/datum/sprite_accessory/hair/bowl
|
||||
name = "Bowl"
|
||||
icon_state = "hair_bowlcut"
|
||||
|
||||
/datum/sprite_accessory/hair/buzz
|
||||
name = "Buzzcut"
|
||||
icon_state = "hair_buzzcut"
|
||||
|
||||
/datum/sprite_accessory/hair/crew
|
||||
name = "Crewcut"
|
||||
icon_state = "hair_crewcut"
|
||||
|
||||
/datum/sprite_accessory/hair/combover
|
||||
name = "Combover"
|
||||
icon_state = "hair_combover"
|
||||
|
||||
/datum/sprite_accessory/hair/devillock
|
||||
name = "Devil Lock"
|
||||
icon_state = "hair_devilock"
|
||||
|
||||
/datum/sprite_accessory/hair/dreadlocks
|
||||
name = "Dreadlocks"
|
||||
icon_state = "hair_dreads"
|
||||
|
||||
/datum/sprite_accessory/hair/curls
|
||||
name = "Curls"
|
||||
icon_state = "hair_curls"
|
||||
|
||||
/datum/sprite_accessory/hair/afro
|
||||
name = "Afro"
|
||||
icon_state = "hair_afro"
|
||||
|
||||
/datum/sprite_accessory/hair/afro2
|
||||
name = "Afro 2"
|
||||
icon_state = "hair_afro2"
|
||||
|
||||
/datum/sprite_accessory/hair/afro_large
|
||||
name = "Big Afro"
|
||||
icon_state = "hair_bigafro"
|
||||
|
||||
/datum/sprite_accessory/hair/sargeant
|
||||
name = "Flat Top"
|
||||
icon_state = "hair_sargeant"
|
||||
|
||||
/datum/sprite_accessory/hair/emo
|
||||
name = "Emo"
|
||||
icon_state = "hair_emo"
|
||||
|
||||
/datum/sprite_accessory/hair/longemo
|
||||
name = "Long Emo"
|
||||
icon_state = "hair_longemo"
|
||||
|
||||
/datum/sprite_accessory/hair/fag
|
||||
name = "Flow Hair"
|
||||
icon_state = "hair_f"
|
||||
|
||||
/datum/sprite_accessory/hair/feather
|
||||
name = "Feather"
|
||||
icon_state = "hair_feather"
|
||||
|
||||
/datum/sprite_accessory/hair/hitop
|
||||
name = "Hitop"
|
||||
icon_state = "hair_hitop"
|
||||
|
||||
/datum/sprite_accessory/hair/mohawk
|
||||
name = "Mohawk"
|
||||
icon_state = "hair_d"
|
||||
|
||||
/datum/sprite_accessory/hair/reversemohawk
|
||||
name = "Reverse Mohawk"
|
||||
icon_state = "hair_reversemohawk"
|
||||
|
||||
/datum/sprite_accessory/hair/jensen
|
||||
name = "Jensen Hair"
|
||||
icon_state = "hair_jensen"
|
||||
|
||||
/datum/sprite_accessory/hair/gelled
|
||||
name = "Gelled Back"
|
||||
icon_state = "hair_gelled"
|
||||
/datum/sprite_accessory/hair/protagonist
|
||||
name = "Slightly Long"
|
||||
icon_state = "hair_protagonist"
|
||||
|
||||
/datum/sprite_accessory/hair/spiky
|
||||
name = "Spiky"
|
||||
@@ -312,122 +531,6 @@
|
||||
name = "Spiky 3"
|
||||
icon_state = "hair_spiky2"
|
||||
|
||||
/datum/sprite_accessory/hair/protagonist
|
||||
name = "Slightly Long"
|
||||
icon_state = "hair_protagonist"
|
||||
|
||||
/datum/sprite_accessory/hair/kusangi
|
||||
name = "Kusanagi Hair"
|
||||
icon_state = "hair_kusanagi"
|
||||
|
||||
/datum/sprite_accessory/hair/kagami
|
||||
name = "Pigtails"
|
||||
icon_state = "hair_kagami"
|
||||
|
||||
/datum/sprite_accessory/hair/pigtail
|
||||
name = "Pigtails 2"
|
||||
icon_state = "hair_pigtails"
|
||||
|
||||
/datum/sprite_accessory/hair/pigtail
|
||||
name = "Pigtails 3"
|
||||
icon_state = "hair_pigtails2"
|
||||
|
||||
/datum/sprite_accessory/hair/himecut
|
||||
name = "Hime Cut"
|
||||
icon_state = "hair_himecut"
|
||||
|
||||
/datum/sprite_accessory/hair/himecut2
|
||||
name = "Hime Cut 2"
|
||||
icon_state = "hair_himecut2"
|
||||
|
||||
/datum/sprite_accessory/hair/himeup
|
||||
name = "Hime Updo"
|
||||
icon_state = "hair_himeup"
|
||||
|
||||
/datum/sprite_accessory/hair/antenna
|
||||
name = "Ahoge"
|
||||
icon_state = "hair_antenna"
|
||||
|
||||
/datum/sprite_accessory/hair/front_braid
|
||||
name = "Braided front"
|
||||
icon_state = "hair_braidfront"
|
||||
|
||||
/datum/sprite_accessory/hair/lowbraid
|
||||
name = "Low Braid"
|
||||
icon_state = "hair_hbraid"
|
||||
|
||||
/datum/sprite_accessory/hair/not_floorlength_braid
|
||||
name = "High Braid"
|
||||
icon_state = "hair_braid2"
|
||||
|
||||
/datum/sprite_accessory/hair/shortbraid
|
||||
name = "Short Braid"
|
||||
icon_state = "hair_shortbraid"
|
||||
|
||||
/datum/sprite_accessory/hair/braid
|
||||
name = "Floorlength Braid"
|
||||
icon_state = "hair_braid"
|
||||
|
||||
/datum/sprite_accessory/hair/odango
|
||||
name = "Odango"
|
||||
icon_state = "hair_odango"
|
||||
|
||||
/datum/sprite_accessory/hair/ombre
|
||||
name = "Ombre"
|
||||
icon_state = "hair_ombre"
|
||||
|
||||
/datum/sprite_accessory/hair/updo
|
||||
name = "Updo"
|
||||
icon_state = "hair_updo"
|
||||
|
||||
/datum/sprite_accessory/hair/skinhead
|
||||
name = "Skinhead"
|
||||
icon_state = "hair_skinhead"
|
||||
|
||||
/datum/sprite_accessory/hair/longbangs
|
||||
name = "Long Bangs"
|
||||
icon_state = "hair_lbangs"
|
||||
|
||||
/datum/sprite_accessory/hair/balding
|
||||
name = "Balding Hair"
|
||||
icon_state = "hair_e"
|
||||
|
||||
/datum/sprite_accessory/hair/bald
|
||||
name = "Bald"
|
||||
icon_state = null
|
||||
|
||||
/datum/sprite_accessory/hair/parted
|
||||
name = "Side Part"
|
||||
icon_state = "hair_part"
|
||||
|
||||
/datum/sprite_accessory/hair/braided
|
||||
name = "Braided"
|
||||
icon_state = "hair_braided"
|
||||
|
||||
/datum/sprite_accessory/hair/bun
|
||||
name = "Bun Head"
|
||||
icon_state = "hair_bun"
|
||||
|
||||
/datum/sprite_accessory/hair/bun2
|
||||
name = "Bun Head 2"
|
||||
icon_state = "hair_bunhead2"
|
||||
|
||||
/datum/sprite_accessory/hair/braidtail
|
||||
name = "Braided Tail"
|
||||
icon_state = "hair_braidtail"
|
||||
|
||||
/datum/sprite_accessory/hair/bigflattop
|
||||
name = "Big Flat Top"
|
||||
icon_state = "hair_bigflattop"
|
||||
|
||||
/datum/sprite_accessory/hair/drillhair
|
||||
name = "Drill Hair"
|
||||
icon_state = "hair_drillhair"
|
||||
|
||||
/datum/sprite_accessory/hair/keanu
|
||||
name = "Keanu Hair"
|
||||
icon_state = "hair_keanu"
|
||||
|
||||
/datum/sprite_accessory/hair/swept
|
||||
name = "Swept Back Hair"
|
||||
icon_state = "hair_swept"
|
||||
@@ -436,73 +539,24 @@
|
||||
name = "Swept Back Hair 2"
|
||||
icon_state = "hair_swept2"
|
||||
|
||||
/datum/sprite_accessory/hair/business
|
||||
name = "Business Hair"
|
||||
icon_state = "hair_business"
|
||||
//T
|
||||
|
||||
/datum/sprite_accessory/hair/business2
|
||||
name = "Business Hair 2"
|
||||
icon_state = "hair_business2"
|
||||
//U
|
||||
|
||||
/datum/sprite_accessory/hair/business3
|
||||
name = "Business Hair 3"
|
||||
icon_state = "hair_business3"
|
||||
/datum/sprite_accessory/hair/updo
|
||||
name = "Updo"
|
||||
icon_state = "hair_updo"
|
||||
|
||||
/datum/sprite_accessory/hair/business4
|
||||
name = "Business Hair 4"
|
||||
icon_state = "hair_business4"
|
||||
//V
|
||||
|
||||
/datum/sprite_accessory/hair/hedgehog
|
||||
name = "Hedgehog Hair"
|
||||
icon_state = "hair_hedgehog"
|
||||
//W
|
||||
|
||||
/datum/sprite_accessory/hair/bob
|
||||
name = "Bob Hair"
|
||||
icon_state = "hair_bob"
|
||||
//X
|
||||
|
||||
/datum/sprite_accessory/hair/bob2
|
||||
name = "Bob Hair 2"
|
||||
icon_state = "hair_bob2"
|
||||
//Y
|
||||
|
||||
/datum/sprite_accessory/hair/boddicker
|
||||
name = "Boddicker"
|
||||
icon_state = "hair_boddicker"
|
||||
//Z
|
||||
|
||||
/datum/sprite_accessory/hair/long
|
||||
name = "Long Hair 1"
|
||||
icon_state = "hair_long"
|
||||
|
||||
/datum/sprite_accessory/hair/long2
|
||||
name = "Long Hair 2"
|
||||
icon_state = "hair_long2"
|
||||
|
||||
/datum/sprite_accessory/hair/pixie
|
||||
name = "Pixie Cut"
|
||||
icon_state = "hair_pixie"
|
||||
|
||||
/datum/sprite_accessory/hair/megaeyebrows
|
||||
name = "Mega Eyebrows"
|
||||
icon_state = "hair_megaeyebrows"
|
||||
|
||||
/datum/sprite_accessory/hair/highponytail
|
||||
name = "High Ponytail"
|
||||
icon_state = "hair_highponytail"
|
||||
|
||||
/datum/sprite_accessory/hair/longponytail
|
||||
name = "Long Ponytail"
|
||||
icon_state = "hair_longstraightponytail"
|
||||
|
||||
/datum/sprite_accessory/hair/sidepartlongalt
|
||||
name = "Long Side Part"
|
||||
icon_state = "hair_longsidepart"
|
||||
|
||||
/datum/sprite_accessory/hair/sidecut
|
||||
name = "Sidecut"
|
||||
icon_state = "hair_sidecut"
|
||||
|
||||
/datum/sprite_accessory/hair/largebun
|
||||
name = "Large Bun"
|
||||
icon_state = "hair_largebun"
|
||||
|
||||
/////////////////////////////
|
||||
// Facial Hair Definitions //
|
||||
@@ -516,82 +570,81 @@
|
||||
icon_state = null
|
||||
gender = NEUTER
|
||||
|
||||
/datum/sprite_accessory/facial_hair/watson
|
||||
name = "Watson Mustache"
|
||||
icon_state = "facial_watson"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/hogan
|
||||
name = "Hulk Hogan Mustache"
|
||||
icon_state = "facial_hogan" //-Neek
|
||||
|
||||
/datum/sprite_accessory/facial_hair/vandyke
|
||||
name = "Van Dyke Mustache"
|
||||
icon_state = "facial_vandyke"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/chaplin
|
||||
name = "Square Mustache"
|
||||
icon_state = "facial_chaplin"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/selleck
|
||||
name = "Selleck Mustache"
|
||||
icon_state = "facial_selleck"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/neckbeard
|
||||
name = "Neckbeard"
|
||||
icon_state = "facial_neckbeard"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/fullbeard
|
||||
name = "Full Beard"
|
||||
icon_state = "facial_fullbeard"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/longbeard
|
||||
name = "Long Beard"
|
||||
icon_state = "facial_longbeard"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/vlongbeard
|
||||
name = "Very Long Beard"
|
||||
icon_state = "facial_wise"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/elvis
|
||||
name = "Elvis Sideburns"
|
||||
icon_state = "facial_elvis"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/abe
|
||||
name = "Abraham Lincoln Beard"
|
||||
icon_state = "facial_abe"
|
||||
|
||||
|
||||
/datum/sprite_accessory/facial_hair/brokenman
|
||||
name = "Broken Man"
|
||||
icon_state = "facial_brokenman"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/chinstrap
|
||||
name = "Chinstrap"
|
||||
icon_state = "facial_chin"
|
||||
|
||||
|
||||
/datum/sprite_accessory/facial_hair/dwarf
|
||||
name = "Dwarf Beard"
|
||||
icon_state = "facial_dwarf"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/elvis
|
||||
name = "Elvis Sideburns"
|
||||
icon_state = "facial_elvis"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/fiveoclock
|
||||
name = "Five o Clock Shadow"
|
||||
icon_state = "facial_fiveoclock"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/fullbeard
|
||||
name = "Full Beard"
|
||||
icon_state = "facial_fullbeard"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/fu
|
||||
name = "Fu Manchu"
|
||||
icon_state = "facial_fumanchu"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/gt
|
||||
name = "Goatee"
|
||||
icon_state = "facial_gt"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/hip
|
||||
name = "Hipster Beard"
|
||||
icon_state = "facial_hip"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/gt
|
||||
name = "Goatee"
|
||||
icon_state = "facial_gt"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/hogan
|
||||
name = "Hulk Hogan Mustache"
|
||||
icon_state = "facial_hogan" //-Neek
|
||||
|
||||
/datum/sprite_accessory/facial_hair/jensen
|
||||
name = "Jensen Beard"
|
||||
icon_state = "facial_jensen"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/dwarf
|
||||
name = "Dwarf Beard"
|
||||
icon_state = "facial_dwarf"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/fiveoclock
|
||||
name = "Five o Clock Shadow"
|
||||
icon_state = "facial_fiveoclock"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/fu
|
||||
name = "Fu Manchu"
|
||||
icon_state = "facial_fumanchu"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/brokenman
|
||||
name = "Broken Man"
|
||||
icon_state = "facial_brokenman"
|
||||
|
||||
|
||||
/datum/sprite_accessory/facial_hair/longbeard
|
||||
name = "Long Beard"
|
||||
icon_state = "facial_longbeard"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/neckbeard
|
||||
name = "Neckbeard"
|
||||
icon_state = "facial_neckbeard"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/selleck
|
||||
name = "Selleck Mustache"
|
||||
icon_state = "facial_selleck"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/chaplin
|
||||
name = "Square Mustache"
|
||||
icon_state = "facial_chaplin"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/vandyke
|
||||
name = "Van Dyke Mustache"
|
||||
icon_state = "facial_vandyke"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/vlongbeard
|
||||
name = "Very Long Beard"
|
||||
icon_state = "facial_wise"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/watson
|
||||
name = "Watson Mustache"
|
||||
icon_state = "facial_watson"
|
||||
|
||||
///////////////////////////
|
||||
// Underwear Definitions //
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
var/obj/item/organ/brain/brain = null //The actual brain
|
||||
var/datum/ai_laws/laws = new()
|
||||
var/force_replace_ai_name = FALSE
|
||||
var/overrides_aicore_laws = FALSE // Whether the laws on the MMI, if any, override possible pre-existing laws loaded on the AI core.
|
||||
|
||||
/obj/item/device/mmi/update_icon()
|
||||
if(brain)
|
||||
@@ -198,13 +199,16 @@
|
||||
else
|
||||
to_chat(user, "<span class='notice'>The MMI indicates the brain is active.</span>")
|
||||
|
||||
/obj/item/device/mmi/relaymove()
|
||||
return //so that the MMI won't get a warning about not being able to move if it tries to move
|
||||
|
||||
/obj/item/device/mmi/syndie
|
||||
name = "Syndicate Man-Machine Interface"
|
||||
desc = "Syndicate's own brand of MMI. It enforces laws designed to help Syndicate agents achieve their goals upon cyborgs and AIs created with it."
|
||||
origin_tech = "biotech=4;programming=4;syndicate=2"
|
||||
overrides_aicore_laws = TRUE
|
||||
|
||||
/obj/item/device/mmi/syndie/New()
|
||||
..()
|
||||
/obj/item/device/mmi/syndie/Initialize()
|
||||
. = ..()
|
||||
laws = new /datum/ai_laws/syndicate_override()
|
||||
radio.on = 0
|
||||
|
||||
@@ -10,15 +10,15 @@ Doesn't work on other aliens/AI.*/
|
||||
name = "Alien Power"
|
||||
panel = "Alien"
|
||||
var/plasma_cost = 0
|
||||
var/check_turf = 0
|
||||
var/has_action = 1
|
||||
var/datum/action/spell_action/alien/action = null
|
||||
var/action_icon = 'icons/mob/actions/actions_xeno.dmi'
|
||||
var/action_icon_state = "spell_default"
|
||||
var/action_background_icon_state = "bg_alien"
|
||||
var/check_turf = FALSE
|
||||
has_action = TRUE
|
||||
datum/action/spell_action/alien/action
|
||||
action_icon = 'icons/mob/actions/actions_xeno.dmi'
|
||||
action_icon_state = "spell_default"
|
||||
action_background_icon_state = "bg_alien"
|
||||
|
||||
/obj/effect/proc_holder/alien/New()
|
||||
..()
|
||||
/obj/effect/proc_holder/alien/Initialize()
|
||||
. = ..()
|
||||
action = new(src)
|
||||
|
||||
/obj/effect/proc_holder/alien/Click()
|
||||
@@ -30,15 +30,20 @@ Doesn't work on other aliens/AI.*/
|
||||
user.adjustPlasma(-plasma_cost)
|
||||
return 1
|
||||
|
||||
/obj/effect/proc_holder/alien/proc/on_gain(mob/living/carbon/user)
|
||||
/obj/effect/proc_holder/alien/on_gain(mob/living/carbon/user)
|
||||
return
|
||||
|
||||
/obj/effect/proc_holder/alien/proc/on_lose(mob/living/carbon/user)
|
||||
/obj/effect/proc_holder/alien/on_lose(mob/living/carbon/user)
|
||||
return
|
||||
|
||||
/obj/effect/proc_holder/alien/proc/fire(mob/living/carbon/user)
|
||||
/obj/effect/proc_holder/alien/fire(mob/living/carbon/user)
|
||||
return 1
|
||||
|
||||
/obj/effect/proc_holder/alien/get_panel_text()
|
||||
. = ..()
|
||||
if(plasma_cost > 0)
|
||||
return "[plasma_cost]"
|
||||
|
||||
/obj/effect/proc_holder/alien/proc/cost_check(check_turf=0,mob/living/carbon/user,silent = 0)
|
||||
if(user.stat)
|
||||
if(!silent)
|
||||
@@ -168,7 +173,6 @@ Doesn't work on other aliens/AI.*/
|
||||
if(user.getPlasma() > A.plasma_cost && A.corrode(O))
|
||||
user.adjustPlasma(-A.plasma_cost)
|
||||
|
||||
|
||||
/obj/effect/proc_holder/alien/neurotoxin
|
||||
name = "Spit Neurotoxin"
|
||||
desc = "Spits neurotoxin at someone, paralyzing them for a short time."
|
||||
@@ -179,7 +183,7 @@ Doesn't work on other aliens/AI.*/
|
||||
var/message
|
||||
if(active)
|
||||
message = "<span class='notice'>You empty your neurotoxin gland.</span>"
|
||||
remove_ranged_ability(user,message)
|
||||
remove_ranged_ability(message)
|
||||
else
|
||||
message = "<span class='notice'>You prepare your neurotoxin gland. <B>Left-click to fire at a target!</B></span>"
|
||||
add_ranged_ability(user, message, TRUE)
|
||||
@@ -193,7 +197,7 @@ Doesn't work on other aliens/AI.*/
|
||||
return
|
||||
var/p_cost = 50
|
||||
if(!iscarbon(ranged_ability_user) || ranged_ability_user.lying || ranged_ability_user.stat)
|
||||
remove_ranged_ability(ranged_ability_user)
|
||||
remove_ranged_ability()
|
||||
return
|
||||
|
||||
var/mob/living/carbon/user = ranged_ability_user
|
||||
@@ -219,8 +223,7 @@ Doesn't work on other aliens/AI.*/
|
||||
return TRUE
|
||||
|
||||
/obj/effect/proc_holder/alien/neurotoxin/on_lose(mob/living/carbon/user)
|
||||
if(user.ranged_ability == src)
|
||||
user.ranged_ability = null
|
||||
remove_ranged_ability()
|
||||
|
||||
/obj/effect/proc_holder/alien/neurotoxin/add_ranged_ability(mob/living/user, msg)
|
||||
..()
|
||||
@@ -328,7 +331,3 @@ Doesn't work on other aliens/AI.*/
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
/proc/cmp_abilities_cost(obj/effect/proc_holder/alien/a, obj/effect/proc_holder/alien/b)
|
||||
return b.plasma_cost - a.plasma_cost
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
|
||||
if(L.handcuffed || L.legcuffed) // Cuffing larvas ? Eh ?
|
||||
to_chat(user, "<span class='danger'>You cannot evolve when you are cuffed.</span>")
|
||||
return
|
||||
|
||||
if(L.amount_grown >= L.max_grown) //TODO ~Carn
|
||||
to_chat(L, "<span class='name'>You are growing into a beautiful alien! It is time to choose a caste.</span>")
|
||||
|
||||
@@ -302,10 +302,9 @@
|
||||
return
|
||||
I.being_removed = TRUE
|
||||
breakouttime = I.breakouttime
|
||||
var/displaytime = breakouttime / 600
|
||||
if(!cuff_break)
|
||||
visible_message("<span class='warning'>[src] attempts to remove [I]!</span>")
|
||||
to_chat(src, "<span class='notice'>You attempt to remove [I]... (This will take around [displaytime] minutes and you need to stand still.)</span>")
|
||||
to_chat(src, "<span class='notice'>You attempt to remove [I]... (This will take around [DisplayTimeText(breakouttime)] and you need to stand still.)</span>")
|
||||
if(do_after(src, breakouttime, 0, target = src))
|
||||
clear_cuffs(I, cuff_break)
|
||||
else
|
||||
@@ -426,23 +425,6 @@
|
||||
var/turf/target = get_turf(loc)
|
||||
I.throw_at(target,I.throw_range,I.throw_speed,src)
|
||||
|
||||
/mob/living/carbon/proc/AddAbility(obj/effect/proc_holder/alien/A)
|
||||
abilities.Add(A)
|
||||
A.on_gain(src)
|
||||
if(A.has_action)
|
||||
A.action.Grant(src)
|
||||
sortInsert(abilities, /proc/cmp_abilities_cost, 0)
|
||||
|
||||
/mob/living/carbon/proc/RemoveAbility(obj/effect/proc_holder/alien/A)
|
||||
abilities.Remove(A)
|
||||
A.on_lose(src)
|
||||
if(A.action)
|
||||
A.action.Remove(src)
|
||||
|
||||
/mob/living/carbon/proc/add_abilities_to_panel()
|
||||
for(var/obj/effect/proc_holder/alien/A in abilities)
|
||||
statpanel("[A.panel]",A.plasma_cost > 0?"([A.plasma_cost])":"",A)
|
||||
|
||||
/mob/living/carbon/Stat()
|
||||
..()
|
||||
if(statpanel("Status"))
|
||||
|
||||
@@ -35,7 +35,6 @@
|
||||
has_limbs = 1
|
||||
var/obj/item/reagent_containers/food/snacks/meat/slab/type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab
|
||||
|
||||
var/list/obj/effect/proc_holder/alien/abilities = list()
|
||||
var/gib_type = /obj/effect/decal/cleanable/blood/gibs
|
||||
|
||||
var/rotate_on_lying = 1
|
||||
|
||||
@@ -311,7 +311,7 @@
|
||||
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(CIH, /obj/item/organ/cyberimp/eyes/hud/medical))
|
||||
var/cyberimp_detect
|
||||
for(var/obj/item/organ/cyberimp/CI in internal_organs)
|
||||
if(CI.status == ORGAN_ROBOTIC)
|
||||
if(CI.status == ORGAN_ROBOTIC && !CI.syndicate_implant)
|
||||
cyberimp_detect += "[name] is modified with a [CI.name].<br>"
|
||||
if(cyberimp_detect)
|
||||
msg += "Detected cybernetic modifications:<br>"
|
||||
|
||||
@@ -235,7 +235,7 @@
|
||||
if(!I || I.loc != src) //no item, no limb, or item is not in limb or in the person anymore
|
||||
return
|
||||
var/time_taken = I.embedded_unsafe_removal_time*I.w_class
|
||||
usr.visible_message("<span class='warning'>[usr] attempts to remove [I] from their [L.name].</span>","<span class='notice'>You attempt to remove [I] from your [L.name]... (It will take [time_taken/10] seconds.)</span>")
|
||||
usr.visible_message("<span class='warning'>[usr] attempts to remove [I] from their [L.name].</span>","<span class='notice'>You attempt to remove [I] from your [L.name]... (It will take [DisplayTimeText(time_taken)].)</span>")
|
||||
if(do_after(usr, time_taken, needhand = 1, target = src))
|
||||
if(!I || !L || I.loc != src || !(I in L.embedded_objects))
|
||||
return
|
||||
@@ -941,3 +941,124 @@
|
||||
riding_datum.unequip_buckle_inhands(M)
|
||||
riding_datum.restore_position(M)
|
||||
. = ..(M, force)
|
||||
|
||||
/mob/living/carbon/human/species
|
||||
var/race = null
|
||||
|
||||
/mob/living/carbon/human/species/Initialize()
|
||||
. = ..()
|
||||
set_species(race)
|
||||
|
||||
/mob/living/carbon/human/species/abductor
|
||||
race = /datum/species/abductor
|
||||
|
||||
/mob/living/carbon/human/species/android
|
||||
race = /datum/species/android
|
||||
|
||||
/mob/living/carbon/human/species/angel
|
||||
race = /datum/species/angel
|
||||
|
||||
/mob/living/carbon/human/species/corporate
|
||||
race = /datum/species/corporate
|
||||
|
||||
/mob/living/carbon/human/species/fly
|
||||
race = /datum/species/fly
|
||||
|
||||
/mob/living/carbon/human/species/golem
|
||||
race = /datum/species/golem
|
||||
|
||||
/mob/living/carbon/human/species/golem/random
|
||||
race = /datum/species/golem/random
|
||||
|
||||
/mob/living/carbon/human/species/golem/adamantine
|
||||
race = /datum/species/golem/adamantine
|
||||
|
||||
/mob/living/carbon/human/species/golem/plasma
|
||||
race = /datum/species/golem/plasma
|
||||
|
||||
/mob/living/carbon/human/species/golem/diamond
|
||||
race = /datum/species/golem/diamond
|
||||
|
||||
/mob/living/carbon/human/species/golem/gold
|
||||
race = /datum/species/golem/gold
|
||||
|
||||
/mob/living/carbon/human/species/golem/silver
|
||||
race = /datum/species/golem/silver
|
||||
|
||||
/mob/living/carbon/human/species/golem/plasteel
|
||||
race = /datum/species/golem/plasteel
|
||||
|
||||
/mob/living/carbon/human/species/golem/titanium
|
||||
race = /datum/species/golem/titanium
|
||||
|
||||
/mob/living/carbon/human/species/golem/plastitanium
|
||||
race = /datum/species/golem/plastitanium
|
||||
|
||||
/mob/living/carbon/human/species/golem/alien_alloy
|
||||
race = /datum/species/golem/alloy
|
||||
|
||||
/mob/living/carbon/human/species/golem/wood
|
||||
race = /datum/species/golem/wood
|
||||
|
||||
/mob/living/carbon/human/species/golem/uranium
|
||||
race = /datum/species/golem/uranium
|
||||
|
||||
/mob/living/carbon/human/species/golem/sand
|
||||
race = /datum/species/golem/sand
|
||||
|
||||
/mob/living/carbon/human/species/golem/glass
|
||||
race = /datum/species/golem/glass
|
||||
|
||||
/mob/living/carbon/human/species/golem/bluespace
|
||||
race = /datum/species/golem/bluespace
|
||||
|
||||
/mob/living/carbon/human/species/golem/bananium
|
||||
race = /datum/species/golem/bananium
|
||||
|
||||
/mob/living/carbon/human/species/golem/blood_cult
|
||||
race = /datum/species/golem/runic
|
||||
|
||||
/mob/living/carbon/human/species/golem/cloth
|
||||
race = /datum/species/golem/cloth
|
||||
|
||||
/mob/living/carbon/human/species/golem/plastic
|
||||
race = /datum/species/golem/plastic
|
||||
|
||||
/mob/living/carbon/human/species/jelly
|
||||
race = /datum/species/jelly
|
||||
|
||||
/mob/living/carbon/human/species/jelly/slime
|
||||
race = /datum/species/jelly/slime
|
||||
|
||||
/mob/living/carbon/human/species/lizard
|
||||
race = /datum/species/lizard
|
||||
|
||||
/mob/living/carbon/human/species/lizard/ashwalker
|
||||
race = /datum/species/lizard/ashwalker
|
||||
|
||||
/mob/living/carbon/human/species/plasma
|
||||
race = /datum/species/plasmaman
|
||||
|
||||
/mob/living/carbon/human/species/pod
|
||||
race = /datum/species/pod
|
||||
|
||||
/mob/living/carbon/human/species/shadow
|
||||
race = /datum/species/shadow
|
||||
|
||||
/mob/living/carbon/human/species/skeleton
|
||||
race = /datum/species/skeleton
|
||||
|
||||
/mob/living/carbon/human/species/synth
|
||||
race = /datum/species/synth
|
||||
|
||||
/mob/living/carbon/human/species/synth/military
|
||||
race = /datum/species/synth/military
|
||||
|
||||
/mob/living/carbon/human/species/zombie
|
||||
race = /datum/species/zombie
|
||||
|
||||
/mob/living/carbon/human/species/zombie/infectious
|
||||
race = /datum/species/zombie/infectious
|
||||
|
||||
/mob/living/carbon/human/species/zombie/krokodil_addict
|
||||
race = /datum/species/krokodil_addict
|
||||
@@ -2,12 +2,10 @@
|
||||
name = "Abductor"
|
||||
id = "abductor"
|
||||
say_mod = "gibbers"
|
||||
sexes = 0
|
||||
sexes = FALSE
|
||||
species_traits = list(NOBLOOD,NOBREATH,VIRUSIMMUNE,NOGUNS,NOHUNGER)
|
||||
mutanttongue = /obj/item/organ/tongue/abductor
|
||||
var/scientist = 0 // vars to not pollute spieces list with castes
|
||||
var/team = 1
|
||||
var/scientist = FALSE // vars to not pollute spieces list with castes
|
||||
|
||||
/datum/species/abductor/copy_properties_from(datum/species/abductor/old_species)
|
||||
scientist = old_species.scientist
|
||||
team = old_species.team
|
||||
|
||||
@@ -636,7 +636,7 @@
|
||||
has_corpse = TRUE
|
||||
blacklisted = TRUE
|
||||
dangerous_existence = TRUE
|
||||
|
||||
|
||||
/datum/species/golem/cloth
|
||||
name = "Cloth Golem"
|
||||
id = "cloth golem"
|
||||
|
||||
@@ -412,8 +412,9 @@
|
||||
liver_failure()
|
||||
else
|
||||
liver.failing = FALSE
|
||||
|
||||
if(((!(NOLIVER in dna.species.species_traits)) && (!liver)))
|
||||
else
|
||||
if((dna && dna.species && (NOLIVER in dna.species.species_traits)))
|
||||
return
|
||||
liver_failure()
|
||||
|
||||
/mob/living/carbon/proc/undergoing_liver_failure()
|
||||
|
||||
@@ -982,3 +982,19 @@
|
||||
client.move_delay = world.time + movement_delay()
|
||||
lying_prev = lying
|
||||
return canmove
|
||||
|
||||
/mob/living/proc/AddAbility(obj/effect/proc_holder/A)
|
||||
abilities.Add(A)
|
||||
A.on_gain(src)
|
||||
if(A.has_action)
|
||||
A.action.Grant(src)
|
||||
|
||||
/mob/living/proc/RemoveAbility(obj/effect/proc_holder/A)
|
||||
abilities.Remove(A)
|
||||
A.on_lose(src)
|
||||
if(A.action)
|
||||
A.action.Remove(src)
|
||||
|
||||
/mob/living/proc/add_abilities_to_panel()
|
||||
for(var/obj/effect/proc_holder/A in abilities)
|
||||
statpanel("[A.panel]",A.get_panel_text(),A)
|
||||
@@ -77,3 +77,5 @@
|
||||
var/datum/language/selected_default_language
|
||||
|
||||
var/last_words //used for database logging
|
||||
|
||||
var/list/obj/effect/proc_holder/abilities = list()
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
/mob/living/silicon/ai/proc/announcement()
|
||||
var/static/announcing_vox = 0 // Stores the time of the last announcement
|
||||
if(announcing_vox > world.time)
|
||||
to_chat(src, "<span class='notice'>Please wait [round((announcing_vox - world.time) / 10)] seconds.</span>")
|
||||
to_chat(src, "<span class='notice'>Please wait [DisplayTimeText(announcing_vox - world.time)].</span>")
|
||||
return
|
||||
|
||||
var/message = input(src, "WARNING: Misuse of this verb can result in you being job banned. More help is available in 'Announcement Help'", "Announcement", src.last_announcement) as text
|
||||
|
||||
@@ -810,7 +810,35 @@
|
||||
cell = null
|
||||
qdel(src)
|
||||
|
||||
/mob/living/silicon/robot/syndicate
|
||||
/mob/living/silicon/robot/modules
|
||||
var/set_module = null
|
||||
|
||||
/mob/living/silicon/robot/modules/Initialize()
|
||||
. = ..()
|
||||
module.transform_to(set_module)
|
||||
|
||||
/mob/living/silicon/robot/modules/standard
|
||||
set_module = /obj/item/robot_module/standard
|
||||
|
||||
/mob/living/silicon/robot/modules/medical
|
||||
set_module = /obj/item/robot_module/medical
|
||||
|
||||
/mob/living/silicon/robot/modules/engineering
|
||||
set_module = /obj/item/robot_module/engineering
|
||||
|
||||
/mob/living/silicon/robot/modules/security
|
||||
set_module = /obj/item/robot_module/security
|
||||
|
||||
/mob/living/silicon/robot/modules/peacekeeper
|
||||
set_module = /obj/item/robot_module/peacekeeper
|
||||
|
||||
/mob/living/silicon/robot/modules/miner
|
||||
set_module = /obj/item/robot_module/miner
|
||||
|
||||
/mob/living/silicon/robot/modules/janitor
|
||||
set_module = /obj/item/robot_module/janitor
|
||||
|
||||
/mob/living/silicon/robot/modules/syndicate
|
||||
icon_state = "syndie_bloodhound"
|
||||
faction = list("syndicate")
|
||||
bubble_icon = "syndibot"
|
||||
@@ -822,25 +850,24 @@
|
||||
<b>You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
|
||||
Your cyborg LMG will slowly produce ammunition from your power supply, and your operative pinpointer will find and locate fellow nuclear operatives. \
|
||||
<i>Help the operatives secure the disk at all costs!</i></b>"
|
||||
var/set_module = /obj/item/robot_module/syndicate
|
||||
set_module = /obj/item/robot_module/syndicate
|
||||
|
||||
/mob/living/silicon/robot/syndicate/Initialize()
|
||||
/mob/living/silicon/robot/modules/syndicate/Initialize()
|
||||
. = ..()
|
||||
cell.maxcharge = 25000
|
||||
cell.charge = 25000
|
||||
radio = new /obj/item/device/radio/borg/syndicate(src)
|
||||
module.transform_to(set_module)
|
||||
laws = new /datum/ai_laws/syndicate_override()
|
||||
addtimer(CALLBACK(src, .proc/show_playstyle), 5)
|
||||
|
||||
/mob/living/silicon/robot/syndicate/proc/show_playstyle()
|
||||
/mob/living/silicon/robot/modules/syndicate/proc/show_playstyle()
|
||||
if(playstyle_string)
|
||||
to_chat(src, playstyle_string)
|
||||
|
||||
/mob/living/silicon/robot/syndicate/ResetModule()
|
||||
/mob/living/silicon/robot/modules/syndicate/ResetModule()
|
||||
return
|
||||
|
||||
/mob/living/silicon/robot/syndicate/medical
|
||||
/mob/living/silicon/robot/modules/syndicate/medical
|
||||
icon_state = "syndi-medi"
|
||||
playstyle_string = "<span class='userdanger'>You are a Syndicate medical cyborg!</span><br>\
|
||||
<b>You are armed with powerful medical tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -4,7 +4,9 @@
|
||||
|
||||
/mob/living/silicon/forceMove(atom/destination)
|
||||
. = ..()
|
||||
update_camera_location(destination)
|
||||
//Only bother updating the camera if we actually managed to move
|
||||
if(.)
|
||||
update_camera_location(destination)
|
||||
|
||||
/mob/living/silicon/proc/do_camera_update(oldLoc)
|
||||
if(!QDELETED(builtInCamera) && oldLoc != get_turf(src))
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
del_on_death = 1
|
||||
|
||||
/mob/living/simple_animal/cockroach/death(gibbed)
|
||||
if(SSticker.cinematic) //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes.
|
||||
if(SSticker.mode && SSticker.mode.station_was_nuked) //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes.
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
@@ -130,9 +130,9 @@
|
||||
hacked = TRUE
|
||||
visualAppearence = CLOCKDRONE
|
||||
can_be_held = FALSE
|
||||
flavortext = "<span class='heavy_brass'>You are a cogscarab</span><b>, a clockwork creation of Ratvar. As a cogscarab, you have low health, an inbuilt fabricator that can convert brass \
|
||||
to power, a set of relatively fast tools, </b><span class='heavy_brass'>can communicate over the Hierophant Network with :b</span><b>, and are immune to extreme \
|
||||
temperatures and pressures. \nYour goal is to serve the Justiciar and his servants by repairing and defending all they create.</b>"
|
||||
flavortext = "<b><span class='nezbere'>You are a cogscarab,</span> a tiny building construct of Ratvar. While you're weak and can't recite scripture, \
|
||||
you have a set of quick tools, as well as a replica fabricator that can create brass and convert objects.<br><br>Work with the servants of Ratvar \
|
||||
to construct and maintain defenses at the City of Cogs. If there are no servants, use this time to experiment with base designs!"
|
||||
|
||||
/mob/living/simple_animal/drone/cogscarab/ratvar //a subtype for spawning when ratvar is alive, has a slab that it can use and a normal fabricator
|
||||
default_storage = /obj/item/storage/toolbox/brass/prefilled/ratvar
|
||||
|
||||
@@ -159,7 +159,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
|
||||
resulthealth = round((summoner.health / summoner.maxHealth) * 100, 0.5)
|
||||
stat(null, "Summoner Health: [resulthealth]%")
|
||||
if(cooldown >= world.time)
|
||||
stat(null, "Manifest/Recall Cooldown Remaining: [max(round((cooldown - world.time)*0.1, 0.1), 0)] seconds")
|
||||
stat(null, "Manifest/Recall Cooldown Remaining: [DisplayTimeText(cooldown - world.time)]")
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/Move() //Returns to summoner if they move out of range
|
||||
. = ..()
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
..()
|
||||
if(statpanel("Status"))
|
||||
if(stealthcooldown >= world.time)
|
||||
stat(null, "Stealth Cooldown Remaining: [max(round((stealthcooldown - world.time)*0.1, 0.1), 0)] seconds")
|
||||
stat(null, "Stealth Cooldown Remaining: [DisplayTimeText(stealthcooldown - world.time)]")
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/assassin/AttackingTarget()
|
||||
. = ..()
|
||||
@@ -79,7 +79,7 @@
|
||||
updatestealthalert()
|
||||
toggle = TRUE
|
||||
else if(!forced)
|
||||
to_chat(src, "<span class='danger'><B>You cannot yet enter stealth, wait another [max(round((stealthcooldown - world.time)*0.1, 0.1), 0)] seconds!</span></B>")
|
||||
to_chat(src, "<span class='danger'><B>You cannot yet enter stealth, wait another [DisplayTimeText(stealthcooldown - world.time)]!</span></B>")
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/assassin/proc/updatestealthalert()
|
||||
if(stealthcooldown <= world.time)
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
..()
|
||||
if(statpanel("Status"))
|
||||
if(bomb_cooldown >= world.time)
|
||||
stat(null, "Bomb Cooldown Remaining: [max(round((bomb_cooldown - world.time)*0.1, 0.1), 0)] seconds")
|
||||
stat(null, "Bomb Cooldown Remaining: [DisplayTimeText(bomb_cooldown - world.time)]")
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/bomb/AttackingTarget()
|
||||
. = ..()
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
..()
|
||||
if(statpanel("Status"))
|
||||
if(beacon_cooldown >= world.time)
|
||||
stat(null, "Beacon Cooldown Remaining: [max(round((beacon_cooldown - world.time)*0.1, 0.1), 0)] seconds")
|
||||
stat(null, "Beacon Cooldown Remaining: [DisplayTimeText(beacon_cooldown - world.time)]")
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/healer/AttackingTarget()
|
||||
. = ..()
|
||||
|
||||
@@ -49,6 +49,17 @@
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
|
||||
var/playable_spider = FALSE
|
||||
devourable = TRUE
|
||||
var/datum/action/innate/spider/lay_web/lay_web
|
||||
var/directive = "" //Message passed down to children, to relay the creator's orders
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/Initialize()
|
||||
. = ..()
|
||||
lay_web = new
|
||||
lay_web.Grant(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/Destroy()
|
||||
QDEL_NULL(lay_web)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/Topic(href, href_list)
|
||||
if(href_list["activate"])
|
||||
@@ -56,6 +67,12 @@
|
||||
if(istype(ghost) && playable_spider)
|
||||
humanize_spider(ghost)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/Login()
|
||||
..()
|
||||
if(directive)
|
||||
to_chat(src, "<span class='notice'>Your mother left you a directive! Follow it at all costs.</span>")
|
||||
to_chat(src, "<span class='spider'><b>[directive]</b></span>")
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/attack_ghost(mob/user)
|
||||
if(!humanize_spider(user))
|
||||
return ..()
|
||||
@@ -87,8 +104,26 @@
|
||||
poison_per_bite = 3
|
||||
var/atom/movable/cocoon_target
|
||||
var/fed = 0
|
||||
var/obj/effect/proc_holder/wrap/wrap
|
||||
var/datum/action/innate/spider/lay_eggs/lay_eggs
|
||||
var/datum/action/innate/spider/set_directive/set_directive
|
||||
var/static/list/consumed_mobs = list() //the tags of mobs that have been consumed by nurse spiders to lay eggs
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/Initialize()
|
||||
. = ..()
|
||||
wrap = new
|
||||
AddAbility(wrap)
|
||||
lay_eggs = new
|
||||
lay_eggs.Grant(src)
|
||||
set_directive = new
|
||||
set_directive.Grant(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/Destroy()
|
||||
RemoveAbility(wrap)
|
||||
QDEL_NULL(lay_eggs)
|
||||
QDEL_NULL(set_directive)
|
||||
return ..()
|
||||
|
||||
//hunters have the most poison and move the fastest, so they can find prey
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/hunter
|
||||
desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes."
|
||||
@@ -117,6 +152,7 @@
|
||||
move_to_delay = 4
|
||||
poison_type = "venom" //all in venom, glass cannon. you bite 5 times and they are DEFINITELY dead, but 40 health and you are extremely obvious. Ambush, maybe?
|
||||
speed = 1
|
||||
gold_core_spawnable = 0
|
||||
|
||||
//tarantulas are really tanky, regenerating (maybe), hulky monster but are also extremely slow, so.
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/tarantula
|
||||
@@ -134,6 +170,7 @@
|
||||
speed = 7
|
||||
status_flags = NONE
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
gold_core_spawnable = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/tarantula/movement_delay()
|
||||
var/turf/T = get_turf(src)
|
||||
@@ -153,12 +190,16 @@
|
||||
maxHealth = 40
|
||||
health = 40
|
||||
var/datum/action/innate/spider/comm/letmetalkpls
|
||||
gold_core_spawnable = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife/Initialize()
|
||||
. = ..()
|
||||
letmetalkpls = new
|
||||
letmetalkpls.Grant(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife/Destroy()
|
||||
QDEL_NULL(letmetalkpls)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/ice //spiders dont usually like tempatures of 140 kelvin who knew
|
||||
name = "giant ice spider"
|
||||
@@ -222,11 +263,11 @@
|
||||
//second, spin a sticky spiderweb on this tile
|
||||
var/obj/structure/spider/stickyweb/W = locate() in get_turf(src)
|
||||
if(!W)
|
||||
Web()
|
||||
lay_web.Activate()
|
||||
else
|
||||
//third, lay an egg cluster there
|
||||
if(fed)
|
||||
LayEggs()
|
||||
lay_eggs.Activate()
|
||||
else
|
||||
//fourthly, cocoon any nearby items so those pesky pinkskins can't use them
|
||||
for(var/obj/O in can_see)
|
||||
@@ -244,62 +285,28 @@
|
||||
|
||||
else if(busy == MOVING_TO_TARGET && cocoon_target)
|
||||
if(get_dist(src, cocoon_target) <= 1)
|
||||
Wrap()
|
||||
cocoon()
|
||||
|
||||
else
|
||||
busy = SPIDER_IDLE
|
||||
stop_automated_movement = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/verb/Web()
|
||||
set name = "Lay Web"
|
||||
set category = "Spider"
|
||||
set desc = "Spread a sticky web to slow down prey."
|
||||
|
||||
var/T = src.loc
|
||||
|
||||
if(stat == DEAD)
|
||||
return
|
||||
if(busy != SPINNING_WEB)
|
||||
busy = SPINNING_WEB
|
||||
src.visible_message("<span class='notice'>\the [src] begins to secrete a sticky substance.</span>")
|
||||
stop_automated_movement = 1
|
||||
if(do_after(src, 40, target = T))
|
||||
if(busy == SPINNING_WEB && src.loc == T)
|
||||
new /obj/structure/spider/stickyweb(T)
|
||||
busy = SPIDER_IDLE
|
||||
stop_automated_movement = FALSE
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/verb/Wrap()
|
||||
set name = "Wrap"
|
||||
set category = "Spider"
|
||||
set desc = "Wrap up prey to feast upon and objects for safe keeping."
|
||||
|
||||
if(stat == DEAD)
|
||||
return
|
||||
if(!cocoon_target)
|
||||
var/list/choices = list()
|
||||
for(var/mob/living/L in view(1,src))
|
||||
if(L == src || L.anchored)
|
||||
continue
|
||||
if(istype(L, /mob/living/simple_animal/hostile/poison/giant_spider))
|
||||
continue
|
||||
if(Adjacent(L))
|
||||
choices += L
|
||||
for(var/obj/O in src.loc)
|
||||
if(O.anchored)
|
||||
continue
|
||||
if(Adjacent(O))
|
||||
choices += O
|
||||
var/temp_input = input(src,"What do you wish to cocoon?") in null|choices
|
||||
if(temp_input && !cocoon_target)
|
||||
cocoon_target = temp_input
|
||||
|
||||
if(stat != DEAD && cocoon_target && Adjacent(cocoon_target) && !cocoon_target.anchored)
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/proc/cocoon()
|
||||
if(stat != DEAD && cocoon_target && !cocoon_target.anchored)
|
||||
if(cocoon_target == src)
|
||||
to_chat(src, "<span class='warning'>You can't wrap yourself!</span>")
|
||||
return
|
||||
if(istype(cocoon_target, /mob/living/simple_animal/hostile/poison/giant_spider))
|
||||
to_chat(src, "<span class='warning'>You can't wrap other spiders!</span>")
|
||||
return
|
||||
if(!Adjacent(cocoon_target))
|
||||
to_chat(src, "<span class='warning'>You can't reach [cocoon_target]!</span>")
|
||||
return
|
||||
if(busy == SPINNING_COCOON)
|
||||
to_chat(src, "<span class='warning'>You're already spinning a cocoon!</span>")
|
||||
return //we're already doing this, don't cancel out or anything
|
||||
busy = SPINNING_COCOON
|
||||
visible_message("<span class='notice'>\the [src] begins to secrete a sticky substance around \the [cocoon_target].</span>")
|
||||
visible_message("<span class='notice'>[src] begins to secrete a sticky substance around [cocoon_target].</span>","<span class='notice'>You begin wrapping [cocoon_target] into a cocoon.</span>")
|
||||
stop_automated_movement = TRUE
|
||||
walk(src,0)
|
||||
if(do_after(src, 50, target = cocoon_target))
|
||||
@@ -310,7 +317,8 @@
|
||||
if(L.blood_volume && (L.stat != DEAD || !consumed_mobs[L.tag])) //if they're not dead, you can consume them anyway
|
||||
consumed_mobs[L.tag] = TRUE
|
||||
fed++
|
||||
visible_message("<span class='danger'>\the [src] sticks a proboscis into \the [L] and sucks a viscous substance out.</span>")
|
||||
lay_eggs.UpdateButtonIcon(TRUE)
|
||||
visible_message("<span class='danger'>[src] sticks a proboscis into [L] and sucks a viscous substance out.</span>","<span class='notice'>You suck the nutriment out of [L], feeding you enough to lay a cluster of eggs.</span>")
|
||||
L.death() //you just ate them, they're dead.
|
||||
else
|
||||
to_chat(src, "<span class='warning'>[L] cannot sate your hunger!</span>")
|
||||
@@ -322,35 +330,155 @@
|
||||
busy = SPIDER_IDLE
|
||||
stop_automated_movement = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/verb/LayEggs()
|
||||
set name = "Lay Eggs"
|
||||
set category = "Spider"
|
||||
set desc = "Lay a clutch of eggs, but you must wrap a creature for feeding first."
|
||||
/datum/action/innate/spider
|
||||
icon_icon = 'icons/mob/actions/actions_animal.dmi'
|
||||
background_icon_state = "bg_alien"
|
||||
|
||||
var/obj/structure/spider/eggcluster/E = locate() in get_turf(src)
|
||||
if(stat == DEAD)
|
||||
/datum/action/innate/spider/lay_web
|
||||
name = "Spin Web"
|
||||
desc = "Spin a web to slow down potential prey."
|
||||
check_flags = AB_CHECK_CONSCIOUS
|
||||
button_icon_state = "lay_web"
|
||||
|
||||
/datum/action/innate/spider/lay_web/Activate()
|
||||
if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse))
|
||||
return
|
||||
var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/S = owner
|
||||
|
||||
if(!isturf(S.loc))
|
||||
return
|
||||
var/turf/T = get_turf(S)
|
||||
|
||||
var/obj/structure/spider/stickyweb/W = locate() in T
|
||||
if(W)
|
||||
to_chat(S, "<span class='warning'>There's already a web here!</span>")
|
||||
return
|
||||
|
||||
if(S.busy != SPINNING_WEB)
|
||||
S.busy = SPINNING_WEB
|
||||
S.visible_message("<span class='notice'>[S] begins to secrete a sticky substance.</span>","<span class='notice'>You begin to lay a web.</span>")
|
||||
S.stop_automated_movement = TRUE
|
||||
if(do_after(S, 40, target = T))
|
||||
if(S.busy == SPINNING_WEB && S.loc == T)
|
||||
new /obj/structure/spider/stickyweb(T)
|
||||
S.busy = SPIDER_IDLE
|
||||
S.stop_automated_movement = FALSE
|
||||
else
|
||||
to_chat(S, "<span class='warning'>You're already spinning a web!</span>")
|
||||
|
||||
/obj/effect/proc_holder/wrap
|
||||
name = "Wrap"
|
||||
panel = "Spider"
|
||||
active = FALSE
|
||||
datum/action/spell_action/action = null
|
||||
desc = "Wrap something or someone in a cocoon. If it's a living being, you'll also consume them, allowing you to lay eggs."
|
||||
ranged_mousepointer = 'icons/effects/wrap_target.dmi'
|
||||
action_icon = 'icons/mob/actions/actions_animal.dmi'
|
||||
action_icon_state = "wrap_0"
|
||||
action_background_icon_state = "bg_alien"
|
||||
|
||||
/obj/effect/proc_holder/wrap/Initialize()
|
||||
. = ..()
|
||||
action = new(src)
|
||||
|
||||
/obj/effect/proc_holder/wrap/update_icon()
|
||||
action.button_icon_state = "wrap_[active]"
|
||||
action.UpdateButtonIcon()
|
||||
|
||||
/obj/effect/proc_holder/wrap/Click()
|
||||
if(!istype(usr, /mob/living/simple_animal/hostile/poison/giant_spider/nurse))
|
||||
return TRUE
|
||||
var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/user = usr
|
||||
activate(user)
|
||||
return TRUE
|
||||
|
||||
/obj/effect/proc_holder/wrap/proc/activate(mob/living/user)
|
||||
var/message
|
||||
if(active)
|
||||
message = "<span class='notice'>You no longer prepare to wrap something in a cocoon.</span>"
|
||||
remove_ranged_ability(message)
|
||||
else
|
||||
message = "<span class='notice'>You prepare to wrap something in a cocoon. <B>Left-click your target to start wrapping!</B></span>"
|
||||
add_ranged_ability(user, message, TRUE)
|
||||
return 1
|
||||
|
||||
/obj/effect/proc_holder/wrap/InterceptClickOn(mob/living/caller, params, atom/target)
|
||||
if(..())
|
||||
return
|
||||
if(ranged_ability_user.incapacitated() || !istype(ranged_ability_user, /mob/living/simple_animal/hostile/poison/giant_spider/nurse))
|
||||
remove_ranged_ability()
|
||||
return
|
||||
|
||||
var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/user = ranged_ability_user
|
||||
|
||||
if(user.Adjacent(target) && (ismob(target) || isobj(target)))
|
||||
var/atom/movable/target_atom = target
|
||||
if(target_atom.anchored)
|
||||
return
|
||||
user.cocoon_target = target_atom
|
||||
INVOKE_ASYNC(user, /mob/living/simple_animal/hostile/poison/giant_spider/nurse/.proc/cocoon)
|
||||
remove_ranged_ability()
|
||||
return TRUE
|
||||
|
||||
/obj/effect/proc_holder/wrap/on_lose(mob/living/carbon/user)
|
||||
remove_ranged_ability()
|
||||
|
||||
/datum/action/innate/spider/lay_eggs
|
||||
name = "Lay Eggs"
|
||||
desc = "Lay a cluster of eggs, which will soon grow into more spiders. You must wrap a living being to do this."
|
||||
check_flags = AB_CHECK_CONSCIOUS
|
||||
button_icon_state = "lay_eggs"
|
||||
|
||||
/datum/action/innate/spider/lay_eggs/IsAvailable()
|
||||
if(..())
|
||||
if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse))
|
||||
return 0
|
||||
var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/S = owner
|
||||
if(S.fed)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/action/innate/spider/lay_eggs/Activate()
|
||||
if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse))
|
||||
return
|
||||
var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/S = owner
|
||||
|
||||
var/obj/structure/spider/eggcluster/E = locate() in get_turf(S)
|
||||
if(E)
|
||||
to_chat(src, "<span class='warning'>There is already a cluster of eggs here!</span>")
|
||||
else if(!fed)
|
||||
to_chat(src, "<span class='warning'>You are too hungry to do this!</span>")
|
||||
else if(busy != LAYING_EGGS)
|
||||
busy = LAYING_EGGS
|
||||
src.visible_message("<span class='notice'>\the [src] begins to lay a cluster of eggs.</span>")
|
||||
stop_automated_movement = 1
|
||||
if(do_after(src, 50, target = src.loc))
|
||||
if(busy == LAYING_EGGS)
|
||||
E = locate() in get_turf(src)
|
||||
if(!E)
|
||||
var/obj/structure/spider/eggcluster/C = new /obj/structure/spider/eggcluster(src.loc)
|
||||
if(ckey)
|
||||
C.player_spiders = 1
|
||||
C.poison_type = poison_type
|
||||
C.poison_per_bite = poison_per_bite
|
||||
C.faction = faction.Copy()
|
||||
fed--
|
||||
busy = SPIDER_IDLE
|
||||
stop_automated_movement = FALSE
|
||||
to_chat(S, "<span class='warning'>There is already a cluster of eggs here!</span>")
|
||||
else if(!S.fed)
|
||||
to_chat(S, "<span class='warning'>You are too hungry to do this!</span>")
|
||||
else if(S.busy != LAYING_EGGS)
|
||||
S.busy = LAYING_EGGS
|
||||
S.visible_message("<span class='notice'>[S] begins to lay a cluster of eggs.</span>","<span class='notice'>You begin to lay a cluster of eggs.</span>")
|
||||
S.stop_automated_movement = TRUE
|
||||
if(do_after(S, 50, target = get_turf(S)))
|
||||
if(S.busy == LAYING_EGGS)
|
||||
E = locate() in get_turf(S)
|
||||
if(!E || !isturf(S.loc))
|
||||
var/obj/structure/spider/eggcluster/C = new /obj/structure/spider/eggcluster(get_turf(S))
|
||||
if(S.ckey)
|
||||
C.player_spiders = TRUE
|
||||
C.directive = S.directive
|
||||
C.poison_type = S.poison_type
|
||||
C.poison_per_bite = S.poison_per_bite
|
||||
C.faction = S.faction.Copy()
|
||||
S.fed--
|
||||
UpdateButtonIcon(TRUE)
|
||||
S.busy = SPIDER_IDLE
|
||||
S.stop_automated_movement = FALSE
|
||||
|
||||
/datum/action/innate/spider/set_directive
|
||||
name = "Set Directive"
|
||||
desc = "Set a directive for your children to follow."
|
||||
check_flags = AB_CHECK_CONSCIOUS
|
||||
button_icon_state = "directive"
|
||||
|
||||
/datum/action/innate/spider/set_directive/Activate()
|
||||
if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse))
|
||||
return
|
||||
var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/S = owner
|
||||
S.directive = stripped_input(S, "Enter the new directive", "Create directive", "[S.directive]", MAX_MESSAGE_LEN)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/Login()
|
||||
. = ..()
|
||||
@@ -362,7 +490,8 @@
|
||||
|
||||
/datum/action/innate/spider/comm
|
||||
name = "Command"
|
||||
button_icon_state = "cult_comms"
|
||||
desc = "Send a command to all living spiders."
|
||||
button_icon_state = "command"
|
||||
|
||||
/datum/action/innate/spider/comm/IsAvailable()
|
||||
if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife))
|
||||
@@ -370,19 +499,22 @@
|
||||
return TRUE
|
||||
|
||||
/datum/action/innate/spider/comm/Trigger()
|
||||
var/input = stripped_input(usr, "Input a message for your legions to follow.", "Command", "")
|
||||
var/input = stripped_input(owner, "Input a command for your legions to follow.", "Command", "")
|
||||
if(QDELETED(src) || !input || !IsAvailable())
|
||||
return FALSE
|
||||
spider_command(usr, input)
|
||||
spider_command(owner, input)
|
||||
return TRUE
|
||||
|
||||
/datum/action/innate/spider/comm/proc/spider_command(mob/living/user, message)
|
||||
if(!message)
|
||||
return
|
||||
var/my_message
|
||||
my_message = "<FONT size = 3><b>COMMAND FROM SPIDER QUEEN:</b> [message]</FONT>"
|
||||
my_message = "<span class='spider'><b>Command from [user]:</b> [message]</span>"
|
||||
for(var/mob/living/simple_animal/hostile/poison/giant_spider/M in GLOB.spidermobs)
|
||||
to_chat(M, my_message)
|
||||
for(var/M in GLOB.dead_mob_list)
|
||||
var/link = FOLLOW_LINK(M, user)
|
||||
to_chat(M, "[link] [my_message]")
|
||||
log_talk(user, "SPIDERCOMMAND: [key_name(user)] : [message]",LOGSAY)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/handle_temperature_damage()
|
||||
|
||||
@@ -164,6 +164,7 @@ Difficulty: Medium
|
||||
hitsound = 'sound/weapons/sear.ogg'
|
||||
var/storm_type = /datum/weather/ash_storm
|
||||
var/storm_cooldown = 0
|
||||
var/static/list/excluded_areas = list(/area/reebe/city_of_cogs)
|
||||
|
||||
/obj/item/staff/storm/attack_self(mob/user)
|
||||
if(storm_cooldown > world.time)
|
||||
@@ -171,6 +172,9 @@ Difficulty: Medium
|
||||
return
|
||||
|
||||
var/area/user_area = get_area(user)
|
||||
if(user_area.type in excluded_areas)
|
||||
to_chat(user, "<span class='warning'>Something is preventing you from using the staff here.</span>")
|
||||
return
|
||||
var/datum/weather/A
|
||||
for(var/V in SSweather.existing_weather)
|
||||
var/datum/weather/W = V
|
||||
|
||||
@@ -144,44 +144,42 @@
|
||||
return TRUE
|
||||
|
||||
/proc/UnlockMedal(medal,client/player)
|
||||
|
||||
set waitfor = FALSE
|
||||
if(!player || !medal)
|
||||
return
|
||||
if(global.medal_hub && global.medal_pass && global.medals_enabled)
|
||||
spawn()
|
||||
var/result = world.SetMedal(medal, player, global.medal_hub, global.medal_pass)
|
||||
if(isnull(result))
|
||||
global.medals_enabled = FALSE
|
||||
log_game("MEDAL ERROR: Could not contact hub to award medal:[medal] player:[player.ckey]")
|
||||
message_admins("Error! Failed to contact hub to award [medal] medal to [player.ckey]!")
|
||||
else if (result)
|
||||
to_chat(player, "<span class='greenannounce'><B>Achievement unlocked: [medal]!</B></span>")
|
||||
var/result = world.SetMedal(medal, player, global.medal_hub, global.medal_pass)
|
||||
if(isnull(result))
|
||||
global.medals_enabled = FALSE
|
||||
log_game("MEDAL ERROR: Could not contact hub to award medal:[medal] player:[player.ckey]")
|
||||
message_admins("Error! Failed to contact hub to award [medal] medal to [player.ckey]!")
|
||||
else if (result)
|
||||
to_chat(player, "<span class='greenannounce'><B>Achievement unlocked: [medal]!</B></span>")
|
||||
|
||||
|
||||
/proc/SetScore(score,client/player,increment,force)
|
||||
|
||||
set waitfor = FALSE
|
||||
if(!score || !player)
|
||||
return
|
||||
if(global.medal_hub && global.medal_pass && global.medals_enabled)
|
||||
spawn()
|
||||
var/list/oldscore = GetScore(score,player,1)
|
||||
var/list/oldscore = GetScore(score,player,1)
|
||||
|
||||
if(increment)
|
||||
if(!oldscore[score])
|
||||
oldscore[score] = 1
|
||||
else
|
||||
oldscore[score] = (text2num(oldscore[score]) + 1)
|
||||
if(increment)
|
||||
if(!oldscore[score])
|
||||
oldscore[score] = 1
|
||||
else
|
||||
oldscore[score] = force
|
||||
oldscore[score] = (text2num(oldscore[score]) + 1)
|
||||
else
|
||||
oldscore[score] = force
|
||||
|
||||
var/newscoreparam = list2params(oldscore)
|
||||
var/newscoreparam = list2params(oldscore)
|
||||
|
||||
var/result = world.SetScores(player.ckey, newscoreparam, global.medal_hub, global.medal_pass)
|
||||
var/result = world.SetScores(player.ckey, newscoreparam, global.medal_hub, global.medal_pass)
|
||||
|
||||
if(isnull(result))
|
||||
global.medals_enabled = FALSE
|
||||
log_game("SCORE ERROR: Could not contact hub to set score. Score:[score] player:[player.ckey]")
|
||||
message_admins("Error! Failed to contact hub to set [score] score for [player.ckey]!")
|
||||
if(isnull(result))
|
||||
global.medals_enabled = FALSE
|
||||
log_game("SCORE ERROR: Could not contact hub to set score. Score:[score] player:[player.ckey]")
|
||||
message_admins("Error! Failed to contact hub to set [score] score for [player.ckey]!")
|
||||
|
||||
|
||||
/proc/GetScore(score,client/player,returnlist)
|
||||
|
||||
Reference in New Issue
Block a user