mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 18:53:06 +00:00
@@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
var/dat = "<center><h1>Autolathe Control Panel</h1><hr/>"
|
var/dat = "<center><h1>Autolathe Control Panel</h1><hr/>"
|
||||||
|
|
||||||
if(!panel_open)
|
if(panel_open == 0)
|
||||||
dat += "<table width = '100%'>"
|
dat += "<table width = '100%'>"
|
||||||
var/material_top = "<tr>"
|
var/material_top = "<tr>"
|
||||||
var/material_bottom = "<tr>"
|
var/material_bottom = "<tr>"
|
||||||
@@ -48,41 +48,36 @@
|
|||||||
index++
|
index++
|
||||||
if(R.hidden && !hacked || (show_category != "All" && show_category != R.category))
|
if(R.hidden && !hacked || (show_category != "All" && show_category != R.category))
|
||||||
continue
|
continue
|
||||||
|
var/can_make = 1
|
||||||
|
var/material_string = ""
|
||||||
|
var/multiplier_string = ""
|
||||||
|
var/max_sheets
|
||||||
|
var/comma
|
||||||
|
if(!R.resources || !R.resources.len)
|
||||||
|
material_string = "No resources required.</td>"
|
||||||
|
else
|
||||||
|
//Make sure it's buildable and list requires resources.
|
||||||
|
for(var/material in R.resources)
|
||||||
|
var/sheets = round(stored_material[material]/R.resources[material])
|
||||||
|
if(isnull(max_sheets) || max_sheets > sheets)
|
||||||
|
max_sheets = sheets
|
||||||
|
if(!isnull(stored_material[material]) && stored_material[material] < R.resources[material])
|
||||||
|
can_make = 0
|
||||||
|
if(!comma)
|
||||||
|
comma = 1
|
||||||
|
else
|
||||||
|
material_string += ", "
|
||||||
|
material_string += "[R.resources[material]] [material]"
|
||||||
|
material_string += ".<br></td>"
|
||||||
|
//Build list of multipliers for sheets.
|
||||||
|
if(R.is_stack)
|
||||||
|
if(max_sheets && max_sheets > 0)
|
||||||
|
multiplier_string += "<br>"
|
||||||
|
for(var/i = 5;i<max_sheets;i*=2) //5,10,20,40...
|
||||||
|
multiplier_string += "<a href='?src=\ref[src];make=[index];multiplier=[i]'>\[x[i]\]</a>"
|
||||||
|
multiplier_string += "<a href='?src=\ref[src];make=[index];multiplier=[max_sheets]'>\[x[max_sheets]\]</a>"
|
||||||
|
|
||||||
var/can_make = 1
|
dat += "<tr><td width = 180>[R.hidden ? "<font color = 'red'>*</font>" : ""]<b>[can_make ? "<a href='?src=\ref[src];make=[index];multiplier=1'>" : ""][R.name][can_make ? "</a>" : ""]</b>[R.hidden ? "<font color = 'red'>*</font>" : ""][multiplier_string]</td><td align = right>[material_string]</tr>"
|
||||||
var/material_string = ""
|
|
||||||
var/multiplier_string = ""
|
|
||||||
var/max_sheets
|
|
||||||
|
|
||||||
var/comma
|
|
||||||
if(!R.resources || !R.resources.len)
|
|
||||||
material_string = "No resources required.</td>"
|
|
||||||
else
|
|
||||||
|
|
||||||
//Make sure it's buildable and list requires resources.
|
|
||||||
for(var/material in R.resources)
|
|
||||||
var/sheets = round(stored_material[material]/R.resources[material])
|
|
||||||
if(isnull(max_sheets) || max_sheets > sheets)
|
|
||||||
max_sheets = sheets
|
|
||||||
|
|
||||||
if(!isnull(stored_material[material]) && stored_material[material] < R.resources[material])
|
|
||||||
can_make = 0
|
|
||||||
if(!comma)
|
|
||||||
comma = 1
|
|
||||||
else
|
|
||||||
material_string += ", "
|
|
||||||
material_string += "[R.resources[material]] [material]"
|
|
||||||
material_string += ".<br></td>"
|
|
||||||
|
|
||||||
//Build list of multipliers for sheets.
|
|
||||||
if(R.is_stack)
|
|
||||||
if(max_sheets && max_sheets > 0)
|
|
||||||
multiplier_string += "<br>"
|
|
||||||
for(var/i = 5;i<max_sheets;i*=2) //5,10,20,40...
|
|
||||||
multiplier_string += "<a href='?src=\ref[src];make=[index];multiplier=[i]'>\[x[i]\]</a>"
|
|
||||||
multiplier_string += "<a href='?src=\ref[src];make=[index];multiplier=[max_sheets]'>\[x[max_sheets]\]</a>"
|
|
||||||
|
|
||||||
dat += "<tr><td width = 180>[R.hidden ? "<font color = 'red'>*</font>" : ""]<b>[can_make ? "<a href='?src=\ref[src];make=[index];multiplier=1'>" : ""][R.name][can_make ? "</a>" : ""]</b>[R.hidden ? "<font color = 'red'>*</font>" : ""][multiplier_string]</td><td align = right>[material_string]</tr>"
|
|
||||||
|
|
||||||
dat += "</table><hr>"
|
dat += "</table><hr>"
|
||||||
//Hacking.
|
//Hacking.
|
||||||
|
|||||||
@@ -59,7 +59,7 @@
|
|||||||
if(!proximity) return
|
if(!proximity) return
|
||||||
if(disabled && !isrobot(user))
|
if(disabled && !isrobot(user))
|
||||||
return 0
|
return 0
|
||||||
if(istype(A,/area/shuttle)||istype(A,/turf/space/transit))
|
if(istype(get_area(A),/area/shuttle)||istype(get_area(A),/turf/space/transit))
|
||||||
return 0
|
return 0
|
||||||
return alter_turf(A,user,(mode == 3))
|
return alter_turf(A,user,(mode == 3))
|
||||||
|
|
||||||
|
|||||||
@@ -96,6 +96,10 @@
|
|||||||
device.attack_self(holder.wearer)
|
device.attack_self(holder.wearer)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
var/turf/T = get_turf(target)
|
||||||
|
if(istype(T) && !T.Adjacent(get_turf(src)))
|
||||||
|
return 0
|
||||||
|
|
||||||
var/resolved = target.attackby(device,holder.wearer)
|
var/resolved = target.attackby(device,holder.wearer)
|
||||||
if(!resolved && device && target)
|
if(!resolved && device && target)
|
||||||
device.afterattack(target,holder.wearer,1)
|
device.afterattack(target,holder.wearer,1)
|
||||||
|
|||||||
@@ -76,7 +76,8 @@
|
|||||||
var/datum/effect/effect/system/spark_spread/spark_system
|
var/datum/effect/effect/system/spark_spread/spark_system
|
||||||
|
|
||||||
/obj/item/weapon/rig/examine()
|
/obj/item/weapon/rig/examine()
|
||||||
..()
|
usr << "This is \icon[src][src.name]."
|
||||||
|
usr << "[src.desc]"
|
||||||
if(wearer)
|
if(wearer)
|
||||||
for(var/obj/item/piece in list(helmet,gloves,chest,boots))
|
for(var/obj/item/piece in list(helmet,gloves,chest,boots))
|
||||||
if(!piece || piece.loc != wearer)
|
if(!piece || piece.loc != wearer)
|
||||||
@@ -90,6 +91,7 @@
|
|||||||
/obj/item/weapon/rig/New()
|
/obj/item/weapon/rig/New()
|
||||||
..()
|
..()
|
||||||
|
|
||||||
|
item_state = icon_state
|
||||||
wires = new(src)
|
wires = new(src)
|
||||||
|
|
||||||
if((!req_access || !req_access.len) && (!req_one_access || !req_one_access.len))
|
if((!req_access || !req_access.len) && (!req_one_access || !req_one_access.len))
|
||||||
@@ -140,6 +142,8 @@
|
|||||||
piece.siemens_coefficient = siemens_coefficient
|
piece.siemens_coefficient = siemens_coefficient
|
||||||
piece.permeability_coefficient = permeability_coefficient
|
piece.permeability_coefficient = permeability_coefficient
|
||||||
|
|
||||||
|
update_icon(1)
|
||||||
|
|
||||||
/obj/item/weapon/rig/Del()
|
/obj/item/weapon/rig/Del()
|
||||||
for(var/obj/item/piece in list(gloves,boots,helmet,chest))
|
for(var/obj/item/piece in list(gloves,boots,helmet,chest))
|
||||||
var/mob/living/M = piece.loc
|
var/mob/living/M = piece.loc
|
||||||
@@ -178,13 +182,13 @@
|
|||||||
sealing = 1
|
sealing = 1
|
||||||
|
|
||||||
if(!seal_target && !suit_is_deployed())
|
if(!seal_target && !suit_is_deployed())
|
||||||
M << "<span class='danger'>The suit flashes an error light. It can't function properly without being fully deployed.</span>"
|
M.visible_message("<span class='danger'>[M]'s suit flashes an error light.</span>","<span class='danger'>Your suit flashes an error light. It can't function properly without being fully deployed.</span>")
|
||||||
failed_to_seal = 1
|
failed_to_seal = 1
|
||||||
|
|
||||||
if(!failed_to_seal)
|
if(!failed_to_seal)
|
||||||
|
|
||||||
if(!instant)
|
if(!instant)
|
||||||
M << "<font color='blue'>With a quiet hum, the suit begins running checks and adjusting components.</font>"
|
M.visible_message("<font color='blue'>[M]'s suit emits a quiet hum as it begins to adjust its seals.</font>","<font color='blue'>With a quiet hum, the suit begins running checks and adjusting components.</font>")
|
||||||
if(!do_after(M,SEAL_DELAY))
|
if(!do_after(M,SEAL_DELAY))
|
||||||
if(M) M << "<span class='warning'>You must remain still while the suit is adjusting the components.</span>"
|
if(M) M << "<span class='warning'>You must remain still while the suit is adjusting the components.</span>"
|
||||||
failed_to_seal = 1
|
failed_to_seal = 1
|
||||||
@@ -203,12 +207,11 @@
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
if(!istype(M) || !istype(piece) || !istype(compare_piece) || !msg_type)
|
if(!istype(M) || !istype(piece) || !istype(compare_piece) || !msg_type)
|
||||||
if(!failed_to_seal)
|
if(M) M << "<span class='warning'>You must remain still while the suit is adjusting the components.</span>"
|
||||||
if(M) M << "<span class='warning'>You must remain still while the suit is adjusting the components.</span>"
|
|
||||||
failed_to_seal = 1
|
failed_to_seal = 1
|
||||||
break
|
break
|
||||||
|
|
||||||
if(M.back == src && piece == compare_piece)
|
if(!failed_to_seal && M.back == src && piece == compare_piece)
|
||||||
|
|
||||||
if(!instant)
|
if(!instant)
|
||||||
if(!do_after(M,SEAL_DELAY))
|
if(!do_after(M,SEAL_DELAY))
|
||||||
@@ -232,11 +235,11 @@
|
|||||||
if(!seal_target)
|
if(!seal_target)
|
||||||
if(flags & AIRTIGHT)
|
if(flags & AIRTIGHT)
|
||||||
helmet.flags |= AIRTIGHT
|
helmet.flags |= AIRTIGHT
|
||||||
helmet.flags_inv |= (HIDEEYES|HIDEFACE)
|
helmet.flags_inv |= (HIDEEYES|HIDEFACE|HIDEMASK)
|
||||||
helmet.body_parts_covered |= (FACE|EYES)
|
helmet.body_parts_covered |= (FACE|EYES)
|
||||||
else
|
else
|
||||||
helmet.flags &= ~AIRTIGHT
|
helmet.flags &= ~AIRTIGHT
|
||||||
helmet.flags_inv &= ~(HIDEEYES|HIDEFACE)
|
helmet.flags_inv &= ~(HIDEEYES|HIDEFACE|HIDEMASK)
|
||||||
helmet.body_parts_covered &= ~(FACE|EYES)
|
helmet.body_parts_covered &= ~(FACE|EYES)
|
||||||
helmet.update_light(wearer)
|
helmet.update_light(wearer)
|
||||||
else
|
else
|
||||||
@@ -446,11 +449,8 @@
|
|||||||
|
|
||||||
//TODO: Maybe consider a cache for this (use mob_icon as blank canvas, use suit icon overlay).
|
//TODO: Maybe consider a cache for this (use mob_icon as blank canvas, use suit icon overlay).
|
||||||
overlays.Cut()
|
overlays.Cut()
|
||||||
if(mob_icon)
|
|
||||||
mob_icon.overlays.Cut()
|
|
||||||
|
|
||||||
if(!mob_icon || update_mob_icon)
|
if(!mob_icon || update_mob_icon)
|
||||||
var/species_icon = 'icons/mob/back.dmi'
|
var/species_icon = 'icons/mob/rig_back.dmi'
|
||||||
// Since setting mob_icon will override the species checks in
|
// Since setting mob_icon will override the species checks in
|
||||||
// update_inv_wear_suit(), handle species checks here.
|
// update_inv_wear_suit(), handle species checks here.
|
||||||
if(wearer && sprite_sheets && sprite_sheets[wearer.species.name])
|
if(wearer && sprite_sheets && sprite_sheets[wearer.species.name])
|
||||||
@@ -458,10 +458,8 @@
|
|||||||
mob_icon = image("icon" = species_icon, "icon_state" = "[icon_state]")
|
mob_icon = image("icon" = species_icon, "icon_state" = "[icon_state]")
|
||||||
|
|
||||||
if(installed_modules.len)
|
if(installed_modules.len)
|
||||||
|
|
||||||
for(var/obj/item/rig_module/module in installed_modules)
|
for(var/obj/item/rig_module/module in installed_modules)
|
||||||
if(module.suit_overlay)
|
if(module.suit_overlay)
|
||||||
mob_icon.overlays += image("icon" = 'icons/mob/rig_modules.dmi', "icon_state" = "[module.suit_overlay]")
|
|
||||||
chest.overlays += image("icon" = 'icons/mob/rig_modules.dmi', "icon_state" = "[module.suit_overlay]", "dir" = SOUTH)
|
chest.overlays += image("icon" = 'icons/mob/rig_modules.dmi', "icon_state" = "[module.suit_overlay]", "dir" = SOUTH)
|
||||||
|
|
||||||
if(wearer)
|
if(wearer)
|
||||||
@@ -488,10 +486,9 @@
|
|||||||
user << "<span class='danger'>Unauthorized user. Access denied.</span>"
|
user << "<span class='danger'>Unauthorized user. Access denied.</span>"
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
else if(user.loc && user.loc.loc && istype(user.loc.loc,/obj/item/rig_module/ai_container))
|
else if(!ai_override_enabled)
|
||||||
if(!ai_override_enabled)
|
user << "<span class='danger'>Synthetic access disabled. Please consult hardware provider.</span>"
|
||||||
user << "<span class='danger'>Synthetic access disabled. Please consult hardware provider.</span>"
|
return 0
|
||||||
return 0
|
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|||||||
@@ -122,6 +122,25 @@
|
|||||||
"mutagen" = 15
|
"mutagen" = 15
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/obj/machinery/portable_atmospherics/hydroponics/attack_generic(var/mob/user)
|
||||||
|
if(istype(user,/mob/living/carbon/alien/diona))
|
||||||
|
var/mob/living/carbon/alien/diona/nymph = user
|
||||||
|
|
||||||
|
if(nymph.stat == DEAD || nymph.paralysis || nymph.weakened || nymph.stunned || nymph.restrained())
|
||||||
|
return
|
||||||
|
|
||||||
|
if(weedlevel > 0)
|
||||||
|
nymph.reagents.add_reagent("nutriment", weedlevel)
|
||||||
|
weedlevel = 0
|
||||||
|
nymph.visible_message("<font color='blue'><b>[nymph]</b> begins rooting through [src], ripping out weeds and eating them noisily.</font>","<font color='blue'>You begin rooting through [src], ripping out weeds and eating them noisily.</font>")
|
||||||
|
else if(nymph.nutrition > 100 && nutrilevel < 10)
|
||||||
|
nymph.nutrition -= ((10-nutrilevel)*5)
|
||||||
|
nutrilevel = 10
|
||||||
|
nymph.visible_message("<font color='blue'><b>[nymph]</b> secretes a trickle of green liquid, refilling [src].</font>","<font color='blue'>You secrete a trickle of green liquid, refilling [src].</font>")
|
||||||
|
else
|
||||||
|
nymph.visible_message("<font color='blue'><b>[nymph]</b> rolls around in [src] for a bit.</font>","<font color='blue'>You roll around in [src] for a bit.</font>")
|
||||||
|
return
|
||||||
|
|
||||||
/obj/machinery/portable_atmospherics/hydroponics/New()
|
/obj/machinery/portable_atmospherics/hydroponics/New()
|
||||||
..()
|
..()
|
||||||
temp_chem_holder = new()
|
temp_chem_holder = new()
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
sprite_sheets = list("Vox" = 'icons/mob/species/vox/head.dmi')
|
sprite_sheets = list("Vox" = 'icons/mob/species/vox/head.dmi')
|
||||||
|
|
||||||
/obj/item/weapon/holder/New()
|
/obj/item/weapon/holder/New()
|
||||||
|
item_state = icon_state
|
||||||
..()
|
..()
|
||||||
processing_objects.Add(src)
|
processing_objects.Add(src)
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
var/adult_form
|
var/adult_form
|
||||||
var/dead_icon
|
var/dead_icon
|
||||||
var/amount_grown = 0
|
var/amount_grown = 0
|
||||||
var/max_grown = 10
|
var/max_grown = 200
|
||||||
var/time_of_birth
|
var/time_of_birth
|
||||||
var/language
|
var/language
|
||||||
|
|
||||||
|
|||||||
@@ -6,12 +6,6 @@
|
|||||||
icon_state = "nymph"
|
icon_state = "nymph"
|
||||||
language = "Rootspeak"
|
language = "Rootspeak"
|
||||||
|
|
||||||
amount_grown = 0
|
|
||||||
max_grown = 5 // Target number of donors.
|
|
||||||
|
|
||||||
var/list/donors = list()
|
|
||||||
var/last_checked_stage = 0
|
|
||||||
|
|
||||||
universal_understand = 1
|
universal_understand = 1
|
||||||
universal_speak = 0 // Dionaea do not need to speak to people other than other dionaea.
|
universal_speak = 0 // Dionaea do not need to speak to people other than other dionaea.
|
||||||
holder_type = /obj/item/weapon/holder/diona
|
holder_type = /obj/item/weapon/holder/diona
|
||||||
@@ -20,7 +14,4 @@
|
|||||||
|
|
||||||
..()
|
..()
|
||||||
species = all_species["Diona"]
|
species = all_species["Diona"]
|
||||||
verbs += /mob/living/carbon/proc/eat_weeds
|
|
||||||
verbs += /mob/living/carbon/proc/fertilize_plant
|
|
||||||
verbs += /mob/living/carbon/alien/diona/proc/steal_blood
|
|
||||||
verbs += /mob/living/carbon/alien/diona/proc/merge
|
verbs += /mob/living/carbon/alien/diona/proc/merge
|
||||||
@@ -11,5 +11,6 @@
|
|||||||
src.loc = M
|
src.loc = M
|
||||||
else
|
else
|
||||||
get_scooped(M)
|
get_scooped(M)
|
||||||
|
return
|
||||||
|
|
||||||
..()
|
..()
|
||||||
@@ -63,37 +63,4 @@
|
|||||||
for(var/atom/A in M.contents)
|
for(var/atom/A in M.contents)
|
||||||
if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder))
|
if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder))
|
||||||
return
|
return
|
||||||
M.status_flags &= ~PASSEMOTES
|
M.status_flags &= ~PASSEMOTES
|
||||||
|
|
||||||
/mob/living/carbon/alien/diona/proc/steal_blood()
|
|
||||||
set category = "Abilities"
|
|
||||||
set name = "Steal Blood"
|
|
||||||
set desc = "Take a blood sample from a suitable donor."
|
|
||||||
|
|
||||||
if(stat == DEAD || paralysis || weakened || stunned || restrained())
|
|
||||||
return
|
|
||||||
|
|
||||||
var/list/choices = list()
|
|
||||||
for(var/mob/living/carbon/human/H in oview(1,src))
|
|
||||||
if(src.Adjacent(H))
|
|
||||||
choices += H
|
|
||||||
|
|
||||||
var/mob/living/carbon/human/M = input(src,"Who do you wish to take a sample from?") in null|choices
|
|
||||||
|
|
||||||
if(!M || !src) return
|
|
||||||
|
|
||||||
if(M.species.flags & NO_BLOOD)
|
|
||||||
src << "\red That donor has no blood to take."
|
|
||||||
return
|
|
||||||
|
|
||||||
if(donors.Find(M.real_name))
|
|
||||||
src << "\red That donor offers you nothing new."
|
|
||||||
return
|
|
||||||
|
|
||||||
src.visible_message("\red [src] flicks out a feeler and neatly steals a sample of [M]'s blood.","\red You flick out a feeler and neatly steal a sample of [M]'s blood.")
|
|
||||||
donors += M.real_name
|
|
||||||
for(var/datum/language/L in M.languages)
|
|
||||||
languages |= L
|
|
||||||
|
|
||||||
spawn(25)
|
|
||||||
update_progression()
|
|
||||||
@@ -16,25 +16,4 @@
|
|||||||
del(L)
|
del(L)
|
||||||
|
|
||||||
src.visible_message("\red [src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.","\red You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.")
|
src.visible_message("\red [src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.","\red You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.")
|
||||||
return "Diona"
|
return "Diona"
|
||||||
|
|
||||||
/mob/living/carbon/alien/diona/show_evolution_blurb()
|
|
||||||
//TODO
|
|
||||||
return
|
|
||||||
|
|
||||||
/mob/living/carbon/alien/diona/update_progression()
|
|
||||||
|
|
||||||
amount_grown = donors.len
|
|
||||||
|
|
||||||
if(amount_grown <= last_checked_stage)
|
|
||||||
return
|
|
||||||
|
|
||||||
// Only fire off these messages once.
|
|
||||||
last_checked_stage = amount_grown
|
|
||||||
if(amount_grown == max_grown)
|
|
||||||
src << "\green You feel ready to move on to your next stage of growth."
|
|
||||||
else if(amount_grown == 3)
|
|
||||||
universal_understand = 1
|
|
||||||
src << "\green You feel your awareness expand, and realize you know how to understand the creatures around you."
|
|
||||||
else
|
|
||||||
src << "\green The blood seeps into your small form, and you draw out the echoes of memories and personality from it, working them into your budding mind."
|
|
||||||
@@ -5,10 +5,6 @@
|
|||||||
speak_emote = list("hisses")
|
speak_emote = list("hisses")
|
||||||
icon_state = "larva"
|
icon_state = "larva"
|
||||||
language = "Hivemind"
|
language = "Hivemind"
|
||||||
|
|
||||||
amount_grown = 0
|
|
||||||
max_grown = 200
|
|
||||||
|
|
||||||
maxHealth = 25
|
maxHealth = 25
|
||||||
health = 25
|
health = 25
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,3 @@
|
|||||||
/mob/living/carbon/alien/larva/update_progression()
|
|
||||||
if(amount_grown < max_grown)
|
|
||||||
amount_grown++
|
|
||||||
return
|
|
||||||
|
|
||||||
/mob/living/carbon/alien/larva/confirm_evolution()
|
/mob/living/carbon/alien/larva/confirm_evolution()
|
||||||
|
|
||||||
src << "\blue <b>You are growing into a beautiful alien! It is time to choose a caste.</b>"
|
src << "\blue <b>You are growing into a beautiful alien! It is time to choose a caste.</b>"
|
||||||
|
|||||||
@@ -41,6 +41,8 @@
|
|||||||
del(src)
|
del(src)
|
||||||
|
|
||||||
/mob/living/carbon/alien/proc/update_progression()
|
/mob/living/carbon/alien/proc/update_progression()
|
||||||
|
if(amount_grown < max_grown)
|
||||||
|
amount_grown++
|
||||||
return
|
return
|
||||||
|
|
||||||
/mob/living/carbon/alien/proc/confirm_evolution()
|
/mob/living/carbon/alien/proc/confirm_evolution()
|
||||||
|
|||||||
@@ -1,49 +1,3 @@
|
|||||||
//TODO: Consider renaming carbon/monkey to carbon/small.
|
|
||||||
|
|
||||||
/mob/living/carbon/proc/fertilize_plant()
|
|
||||||
|
|
||||||
set category = "Abilities"
|
|
||||||
set name = "Fertilize plant"
|
|
||||||
set desc = "Turn your food into nutrients for plants."
|
|
||||||
|
|
||||||
if(stat == DEAD || paralysis || weakened || stunned || restrained())
|
|
||||||
return
|
|
||||||
|
|
||||||
var/list/trays = list()
|
|
||||||
for(var/obj/machinery/portable_atmospherics/hydroponics/tray in range(1))
|
|
||||||
if(tray.nutrilevel < 10 && src.Adjacent(tray))
|
|
||||||
trays += tray
|
|
||||||
|
|
||||||
var/obj/machinery/portable_atmospherics/hydroponics/target = input("Select a tray:") as null|anything in trays
|
|
||||||
|
|
||||||
if(!src || !target || target.nutrilevel == 10) return //Sanity check.
|
|
||||||
|
|
||||||
src.nutrition -= ((10-target.nutrilevel)*5)
|
|
||||||
target.nutrilevel = 10
|
|
||||||
src.visible_message("\red [src] secretes a trickle of green liquid, refilling [target]'s nutrient tray.","\red You secrete a trickle of green liquid from your tail, refilling [target]'s nutrient tray.")
|
|
||||||
|
|
||||||
/mob/living/carbon/proc/eat_weeds()
|
|
||||||
|
|
||||||
set category = "Abilities"
|
|
||||||
set name = "Eat Weeds"
|
|
||||||
set desc = "Clean the weeds out of soil or a hydroponics tray."
|
|
||||||
|
|
||||||
if(stat == DEAD || paralysis || weakened || stunned || restrained())
|
|
||||||
return
|
|
||||||
|
|
||||||
var/list/trays = list()
|
|
||||||
for(var/obj/machinery/portable_atmospherics/hydroponics/tray in range(1))
|
|
||||||
if(tray.weedlevel > 0 && src.Adjacent(tray))
|
|
||||||
trays += tray
|
|
||||||
|
|
||||||
var/obj/machinery/portable_atmospherics/hydroponics/target = input("Select a tray:") as null|anything in trays
|
|
||||||
|
|
||||||
if(!src || !target || target.weedlevel == 0) return //Sanity check.
|
|
||||||
|
|
||||||
src.reagents.add_reagent("nutriment", target.weedlevel)
|
|
||||||
target.weedlevel = 0
|
|
||||||
src.visible_message("\red [src] begins rooting through [target], ripping out weeds and eating them noisily.","\red You begin rooting through [target], ripping out weeds and eating them noisily.")
|
|
||||||
|
|
||||||
//Brain slug proc for voluntary removal of control.
|
//Brain slug proc for voluntary removal of control.
|
||||||
/mob/living/carbon/proc/release_control()
|
/mob/living/carbon/proc/release_control()
|
||||||
|
|
||||||
|
|||||||
@@ -131,24 +131,26 @@
|
|||||||
/*
|
/*
|
||||||
This is kind of convoluted, but it seems to break down like this:
|
This is kind of convoluted, but it seems to break down like this:
|
||||||
(note that the chance to miss is exaggerated here since ran_zone() might roll "chest"
|
(note that the chance to miss is exaggerated here since ran_zone() might roll "chest"
|
||||||
|
|
||||||
If aiming for chest:
|
If aiming for chest:
|
||||||
80% chance you hit your target
|
80% chance you hit your target
|
||||||
17% chance you hit a random zone
|
17% chance you hit a random zone
|
||||||
3% chance you miss
|
3% chance you miss
|
||||||
|
|
||||||
If aiming for something else:
|
If aiming for something else:
|
||||||
68% chance you hit your target
|
68% chance you hit your target
|
||||||
17% chance you hit a random zone
|
17% chance you hit a random zone
|
||||||
15% chance you miss
|
15% chance you miss
|
||||||
|
|
||||||
Why don't we just use get_zone_with_miss_chance() ???
|
Why don't we just use get_zone_with_miss_chance() ???
|
||||||
*/
|
*/
|
||||||
if(prob(80))
|
if(prob(80))
|
||||||
hit_zone = ran_zone(hit_zone)
|
hit_zone = ran_zone(hit_zone)
|
||||||
if(prob(15) && hit_zone != "chest") // Missed!
|
if(prob(15) && hit_zone != "chest") // Missed!
|
||||||
attack_message = "[H] attempted to [pick(attack.attack_verb)] [src], but the [attack.attack_noun] missed!"
|
attack_message = "[H] attempted to strike [src], but missed!"
|
||||||
miss_type = 1
|
miss_type = 1
|
||||||
|
else
|
||||||
|
hit_zone = ran_zone(hit_zone)
|
||||||
|
|
||||||
if(!miss_type && block)
|
if(!miss_type && block)
|
||||||
attack_message = "[H] went for [src]'s [affecting.display_name] but was blocked!"
|
attack_message = "[H] went for [src]'s [affecting.display_name] but was blocked!"
|
||||||
@@ -160,9 +162,9 @@
|
|||||||
H.visible_message("<span class='danger'>[attack_message]</span>")
|
H.visible_message("<span class='danger'>[attack_message]</span>")
|
||||||
|
|
||||||
playsound(loc, ((miss_type) ? (miss_type == 1 ? attack.miss_sound : 'sound/weapons/thudswoosh.ogg') : attack.attack_sound), 25, 1, -1)
|
playsound(loc, ((miss_type) ? (miss_type == 1 ? attack.miss_sound : 'sound/weapons/thudswoosh.ogg') : attack.attack_sound), 25, 1, -1)
|
||||||
H.attack_log += text("\[[time_stamp()]\] <font color='red'>[miss_type ? (miss_type == 1 ? "Missed" : "Blocked") : "[pick(attack.attack_verb)]ed"] [src.name] ([src.ckey])</font>")
|
H.attack_log += text("\[[time_stamp()]\] <font color='red'>[miss_type ? (miss_type == 1 ? "Missed" : "Blocked") : "[pick(attack.attack_verb)]"] [src.name] ([src.ckey])</font>")
|
||||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>[miss_type ? (miss_type == 1 ? "Was missed by" : "Has blocked") : "Has Been [pick(attack.attack_verb)]ed"] by [H.name] ([H.ckey])</font>")
|
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>[miss_type ? (miss_type == 1 ? "Was missed by" : "Has blocked") : "Has Been [pick(attack.attack_verb)]ed"] by [H.name] ([H.ckey])</font>")
|
||||||
msg_admin_attack("[key_name(H)] [miss_type ? (miss_type == 1 ? "has missed" : "was blocked by") : "has [pick(attack.attack_verb)]ed"] [key_name(src)]")
|
msg_admin_attack("[key_name(H)] [miss_type ? (miss_type == 1 ? "has missed" : "was blocked by") : "has [pick(attack.attack_verb)]"] [key_name(src)]")
|
||||||
|
|
||||||
if(miss_type)
|
if(miss_type)
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
@@ -107,6 +107,7 @@
|
|||||||
var/organ = affecting.display_name
|
var/organ = affecting.display_name
|
||||||
|
|
||||||
if(!skill) skill = 1
|
if(!skill) skill = 1
|
||||||
|
attack_damage = Clamp(attack_damage, 1, 5)
|
||||||
|
|
||||||
if(target == user)
|
if(target == user)
|
||||||
user.visible_message("<span class='danger'>[user] [pick(attack_verb)] \himself in the [organ]!</span>")
|
user.visible_message("<span class='danger'>[user] [pick(attack_verb)] \himself in the [organ]!</span>")
|
||||||
@@ -125,7 +126,7 @@
|
|||||||
switch(attack_damage)
|
switch(attack_damage)
|
||||||
if(1 to 2) user.visible_message("<span class='danger'>[user] slapped [target]'s [organ]!</span>")
|
if(1 to 2) user.visible_message("<span class='danger'>[user] slapped [target]'s [organ]!</span>")
|
||||||
if(3 to 4) user.visible_message("<span class='danger'>[user] [pick(attack_verb)] [target] in \his [organ]!</span>")
|
if(3 to 4) user.visible_message("<span class='danger'>[user] [pick(attack_verb)] [target] in \his [organ]!</span>")
|
||||||
if(5) user.visible_message("<span class='danger'>[user] slams \his [pick(attack_noun)] into [target]'s [organ]!</span>")
|
if(5) user.visible_message("<span class='danger'>[user] slammed \his [pick(attack_noun)] into [target]'s [organ]!</span>")
|
||||||
if("groin", "l_leg", "r_leg")
|
if("groin", "l_leg", "r_leg")
|
||||||
// -- LOWER BODY -- //
|
// -- LOWER BODY -- //
|
||||||
switch(attack_damage)
|
switch(attack_damage)
|
||||||
@@ -138,7 +139,7 @@
|
|||||||
if(1 to 4) user.visible_message("<span class='danger'>[user] kicked [target] in \his [organ]!</span>")
|
if(1 to 4) user.visible_message("<span class='danger'>[user] kicked [target] in \his [organ]!</span>")
|
||||||
if(5) user.visible_message("<span class='danger'>[user] stomped down hard on [target]'s [organ]!</span>")
|
if(5) user.visible_message("<span class='danger'>[user] stomped down hard on [target]'s [organ]!</span>")
|
||||||
else if (user.loc != target.loc)
|
else if (user.loc != target.loc)
|
||||||
user.visible_message("<span class='danger'>[user] [pick("stomped down hard on", "kicked against", "gave a strong kick against", "slams their foot into")] [target]'s [organ]!</span>")
|
user.visible_message("<span class='danger'>[user] [pick("stomped down hard on", "kicked against", "gave a strong kick against", "slammed their foot into")] [target]'s [organ]!</span>")
|
||||||
else
|
else
|
||||||
user.visible_message("<span class='danger'>[user] [pick("punched", "threw a punch", "struck", "slapped", "rammed their [pick(attack_noun)] into")] [target]'s [organ]!</span>")
|
user.visible_message("<span class='danger'>[user] [pick("punched", "threw a punch", "struck", "slapped", "rammed their [pick(attack_noun)] into")] [target]'s [organ]!</span>")
|
||||||
|
|
||||||
@@ -171,13 +172,13 @@
|
|||||||
switch(zone)
|
switch(zone)
|
||||||
if("head", "mouth", "eyes")
|
if("head", "mouth", "eyes")
|
||||||
// ----- HEAD ----- //
|
// ----- HEAD ----- //
|
||||||
switch(damage)
|
switch(attack_damage)
|
||||||
if(1 to 2) user.visible_message("<span class='danger'>[user] scratched [target] across \his cheek!</span>")
|
if(1 to 2) user.visible_message("<span class='danger'>[user] scratched [target] across \his cheek!</span>")
|
||||||
if(3 to 4) user.visible_message("<span class='danger'>[user] [pick(attack_verb)] [target]'s [pick("head", "neck")] [pick("", "", "", "with spread [pick(attack_noun)]")]!</span>")
|
if(3 to 4) user.visible_message("<span class='danger'>[user] [pick(attack_verb)] [target]'s [pick("head", "neck")] [pick("", "", "", "with spread [pick(attack_noun)]")]!</span>")
|
||||||
if(5) user.visible_message("<span class='danger'>[pick("[user] [pick(attack_verb)] [target] across \his face!", "[user] rakes \his [pick(attack_noun)] across [target]'s face!")]</span>")
|
if(5) user.visible_message("<span class='danger'>[pick("[user] [pick(attack_verb)] [target] across \his face!", "[user] rakes \his [pick(attack_noun)] across [target]'s face!")]</span>")
|
||||||
if("chest", "l_arm", "r_arm", "l_hand", "r_hand", "groin", "l_leg", "r_leg", "l_foot", "r_foot")
|
if("chest", "l_arm", "r_arm", "l_hand", "r_hand", "groin", "l_leg", "r_leg", "l_foot", "r_foot")
|
||||||
// ----- BODY ----- //
|
// ----- BODY ----- //
|
||||||
switch(damage)
|
switch(attack_damage)
|
||||||
if(1 to 2) user.visible_message("<span class='danger'>[user] scratched [target]'s [affecting.display_name]!</span>")
|
if(1 to 2) user.visible_message("<span class='danger'>[user] scratched [target]'s [affecting.display_name]!</span>")
|
||||||
if(3 to 4) user.visible_message("<span class='danger'>[user] [pick(attack_verb)] [pick("", "", "the side of")] [target]'s [affecting.display_name]!</span>")
|
if(3 to 4) user.visible_message("<span class='danger'>[user] [pick(attack_verb)] [pick("", "", "the side of")] [target]'s [affecting.display_name]!</span>")
|
||||||
if(5) user.visible_message("<span class='danger'>[user] tears \his [pick(attack_noun)] deep into [target]'s [affecting.display_name]!</span>")
|
if(5) user.visible_message("<span class='danger'>[user] tears \his [pick(attack_noun)] deep into [target]'s [affecting.display_name]!</span>")
|
||||||
|
|||||||
@@ -760,8 +760,8 @@ proc/get_damage_icon_part(damage_state, body_part)
|
|||||||
|
|
||||||
/mob/living/carbon/human/update_inv_wear_suit(var/update_icons=1)
|
/mob/living/carbon/human/update_inv_wear_suit(var/update_icons=1)
|
||||||
|
|
||||||
if( wear_suit && istype(wear_suit, /obj/item/clothing/suit) ) //TODO check this
|
if( wear_suit && istype(wear_suit, /obj/item/) )
|
||||||
wear_suit.screen_loc = ui_oclothing //TODO
|
wear_suit.screen_loc = ui_oclothing
|
||||||
|
|
||||||
var/image/standing
|
var/image/standing
|
||||||
|
|
||||||
@@ -831,7 +831,7 @@ proc/get_damage_icon_part(damage_state, body_part)
|
|||||||
if(back.icon_override)
|
if(back.icon_override)
|
||||||
overlays_standing[BACK_LAYER] = image("icon" = back.icon_override, "icon_state" = "[back.icon_state]")
|
overlays_standing[BACK_LAYER] = image("icon" = back.icon_override, "icon_state" = "[back.icon_state]")
|
||||||
//If this is a rig and a mob_icon is set, it will take species into account in the rig update_icon() proc.
|
//If this is a rig and a mob_icon is set, it will take species into account in the rig update_icon() proc.
|
||||||
else if(istype(rig) && !rig.offline && rig.mob_icon)
|
else if(istype(rig) && rig.mob_icon)
|
||||||
overlays_standing[BACK_LAYER] = rig.mob_icon
|
overlays_standing[BACK_LAYER] = rig.mob_icon
|
||||||
else if(back.sprite_sheets && back.sprite_sheets[species.name])
|
else if(back.sprite_sheets && back.sprite_sheets[species.name])
|
||||||
overlays_standing[BACK_LAYER] = image("icon" = back.sprite_sheets[species.name], "icon_state" = "[back.icon_state]")
|
overlays_standing[BACK_LAYER] = image("icon" = back.sprite_sheets[species.name], "icon_state" = "[back.icon_state]")
|
||||||
|
|||||||
@@ -16,9 +16,7 @@
|
|||||||
/obj/item/weapon/reagent_containers/food/snacks/proc/On_Consume(var/mob/M)
|
/obj/item/weapon/reagent_containers/food/snacks/proc/On_Consume(var/mob/M)
|
||||||
if(!usr) return
|
if(!usr) return
|
||||||
if(!reagents.total_volume)
|
if(!reagents.total_volume)
|
||||||
if(M == usr)
|
M.visible_message("<span class='notice'>[M] finishes eating \the [src].</span>","<span class='notice'>You finish eating \the [src].</span>")
|
||||||
usr << "<span class='notice'>You finish eating \the [src].</span>"
|
|
||||||
M.visible_message("<span class='notice'>[M] finishes eating \the [src].</span>")
|
|
||||||
usr.drop_from_inventory(src) //so icons update :[
|
usr.drop_from_inventory(src) //so icons update :[
|
||||||
|
|
||||||
if(trash)
|
if(trash)
|
||||||
@@ -194,8 +192,8 @@
|
|||||||
del(src)
|
del(src)
|
||||||
return
|
return
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/snacks/proc/is_sliceable()
|
/obj/item/weapon/reagent_containers/food/snacks/proc/is_sliceable()
|
||||||
return (slices_num && slice_path && slices_num > 0)
|
return (slices_num && slice_path && slices_num > 0)
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/snacks/Del()
|
/obj/item/weapon/reagent_containers/food/snacks/Del()
|
||||||
if(contents)
|
if(contents)
|
||||||
@@ -206,24 +204,18 @@
|
|||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// FOOD END
|
/// FOOD END
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/snacks/attack_generic(var/mob/living/user)
|
/obj/item/weapon/reagent_containers/food/snacks/attack_generic(var/mob/living/user)
|
||||||
|
if(!isanimal(user) && !isalien(user))
|
||||||
if(isanimal(user) || isalien(user))
|
return
|
||||||
|
user.visible_message("<b>[user]</b> nibbles away at the [src].","You nibble away at the [src].")
|
||||||
if(bitecount == 0 || prob(50))
|
bitecount++
|
||||||
user.custom_emote(1,"nibbles away at the [src]")
|
if(reagents && user.reagents)
|
||||||
bitecount++
|
reagents.trans_to_ingest(user, bitesize)
|
||||||
|
spawn(5)
|
||||||
if(reagents && user.reagents)
|
if(!src && !user.client)
|
||||||
reagents.trans_to_ingest(user, bitesize)
|
user.custom_emote(1,"[pick("burps", "cries for more", "burps twice", "looks at the area where the food was")]")
|
||||||
|
del(src)
|
||||||
spawn(5)
|
On_Consume(user)
|
||||||
if(!src && !user.client)
|
|
||||||
user.custom_emote(1,"[pick("burps", "cries for more", "burps twice", "looks at the area where the food was")]")
|
|
||||||
del(src)
|
|
||||||
|
|
||||||
On_Consume(user)
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////
|
//////////////////////////////////////////////////
|
||||||
////////////////////////////////////////////Snacks
|
////////////////////////////////////////////Snacks
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 153 KiB After Width: | Height: | Size: 153 KiB |
BIN
icons/mob/rig_back.dmi
Normal file
BIN
icons/mob/rig_back.dmi
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
Reference in New Issue
Block a user