Merge branch 'master' into protean-rework

This commit is contained in:
BlackMajor
2023-01-30 00:21:50 +13:00
committed by GitHub
553 changed files with 196571 additions and 301169 deletions
@@ -0,0 +1,23 @@
/obj/machinery/cash_register/medical
req_access = list()
req_one_access = list(access_medical,access_heads)
/obj/machinery/cash_register/engineering
req_access = list()
req_one_access = list(access_engine_equip,access_heads)
/obj/machinery/cash_register/science
req_access = list()
req_one_access = list(access_tox,access_heads)
/obj/machinery/cash_register/security
req_access = list()
req_one_access = list(access_brig,access_heads)
/obj/machinery/cash_register/cargo
req_access = list()
req_one_access = list(access_cargo,access_heads)
/obj/machinery/cash_register/civilian
req_access = list()
req_one_access = list(access_kitchen,access_bar,access_hydroponics,access_heads)
@@ -13,3 +13,6 @@
var/hide_glasses = FALSE
var/speech_sound_enabled = TRUE
var/nutrition_hidden = FALSE
/mob/living/carbon/human/ai_controlled
low_priority = TRUE
@@ -1,4 +1,7 @@
/datum/species/vox
icobase = 'icons/mob/human_races/r_vox_ch.dmi'
tail = "voxtail"
tail_animation = 'icons/mob/species/vox/tail.dmi'
speech_chance = 50 // As long as we're making the option to disable it, might as well bump up the chances when it is enabled
inherent_verbs = list(
/mob/living/carbon/human/proc/toggle_speech_sounds
@@ -28,7 +28,8 @@
if(!istype(refactory))
to_chat(caller,"<span class='warning'>You don't have a working refactory module!</span>")
return
var/choice = tgui_input_list(caller,"Pick the bodypart to change:", "Refactor - One Bodypart", species.has_limbs)
var/choice = tgui_input_list(src,"Pick the bodypart to change:", "Refactor - One Bodypart", species.has_limbs)
if(!choice)
return
@@ -69,7 +70,7 @@
var/datum/robolimb/M = chargen_robolimbs[company]
if(!(choice in M.parts))
continue
if(impersonate_bodytype in M.species_cannot_use)
if(species?.base_species in M.species_cannot_use)
continue
if(M.whitelisted_to && !(ckey in M.whitelisted_to))
continue
@@ -238,7 +239,6 @@
var/new_species = tgui_input_list(usr, "Please select a species to emulate.", "Shapeshifter Body", GLOB.playable_species)
if(new_species)
impersonate_bodytype = new_species
species?.base_species = new_species // Really though you better have a species
regenerate_icons() //Expensive, but we need to recrunch all the icons we're wearing
@@ -10,6 +10,9 @@
knockout_message = "collapses inwards, forming a disordered puddle of gray goo."
remains_type = /obj/effect/decal/cleanable/ash
selects_bodytype = SELECTS_BODYTYPE_SHAPESHIFTER
base_species = SPECIES_HUMAN
blood_color = "#505050" //This is the same as the 80,80,80 below, but in hex
flesh_color = "#505050"
base_color = "#FFFFFF" //Color mult, start out with this
@@ -134,9 +137,12 @@
saved_nif.quick_implant(H)
/datum/species/protean/get_bodytype(var/mob/living/carbon/human/H)
if(H)
return H.impersonate_bodytype || ..()
return ..()
if(!H || base_species == name) return ..()
var/datum/species/S = GLOB.all_species[base_species]
return S.get_bodytype(H)
/datum/species/protean/get_valid_shapeshifter_forms(var/mob/living/carbon/human/H)
return GLOB.playable_species
/datum/species/protean/handle_post_spawn(var/mob/living/carbon/human/H)
..()
@@ -44,6 +44,9 @@
/datum/species/custom
digi_allowed = TRUE
/datum/species/shapeshifter/promethean
digi_allowed = TRUE
/datum/species/unathi
digi_allowed = TRUE
vore_belly_default_variant = "L"
@@ -72,3 +75,6 @@
/datum/species/xenochimera
digi_allowed = TRUE
/datum/species/protean
digi_allowed = TRUE
@@ -9,8 +9,8 @@
var/mob/living/carbon/human/DraggedH = src
//make sure src (the dragged) is a teshari
if(DraggedH.species.name == SPECIES_TESHARI)
//make sure src (the dragged) is a teshari (or shaped like one)
if(DraggedH.species.get_bodytype() == SPECIES_TESHARI)
var/mob/living/M = over_object
// only perform the grab if; grabber and grabbed adjacent, caller is grabbed OR grabber, and the grabbed's grab preference is true.
if(holder_type && istype(M) && Adjacent(M) && (usr == M || usr == DraggedH) && DraggedH != M && !M.incapacitated() && DraggedH.pickup_pref && (M != usr || (M == usr && M.pickup_active)) && (DraggedH.a_intent == I_HELP && M.a_intent == I_HELP)) //VOREStation Edit
@@ -23,7 +23,7 @@
/obj/structure/plasticflaps/CanPass(atom/A, turf/T)
var/mob/living/carbon/human/H = A
if(istype(H))
if(H.species.name == SPECIES_TESHARI)
if(H.species.get_bodytype() == SPECIES_TESHARI)
return 1
return ..()
@@ -16,7 +16,7 @@
for(var/f in list(BP_L_FOOT, BP_R_FOOT))
var/obj/item/organ/external/foot/foot = get_organ(f)
if(istype(foot) && foot.is_hidden_by_tail()) //If either foot is hidden by the tail, don't render footwear.
if(istype(foot) && foot.is_hidden_by_sprite_accessory()) //If either foot is hidden by the tail, don't render footwear.
return
var/obj/item/clothing/shoes/shoe = shoes
@@ -0,0 +1,45 @@
/mob/living/simple_mob/humanoid/cultist/human/bloodjaunt/fireball //Teleporting Cultists, now with fireballs
name = "Burning Mage"
desc = "An indiuval wrapped up in red robes, with orange highlights, their paws glowing.."
icon_state = "fire-fluff"
icon_living = "fire-fluff"
special_attack_min_range = 4
special_attack_max_range = 7
special_attack_cooldown = 10 SECONDS
harm_intent_damage = 5
melee_damage_lower = 5
melee_damage_upper = 10
ai_holder_type = /datum/ai_holder/simple_mob/ranged
projectiletype = /obj/item/projectile/energy/fireball
/mob/living/simple_mob/humanoid/cultist/noodle
name = "Converted"
desc = "An indiuval wrapped up in a makeshift rig, made from fallen cultist."
icon_state = "cobra-cultist"
icon_living = "cobra-cultist"
maxHealth = 150
health = 150
faction = "cult"
status_flags = 0
response_help = "pokes"
response_disarm = "shoves"
response_harm = "hits"
harm_intent_damage = 5
melee_damage_lower = 15
melee_damage_upper = 25
attack_sharp = 1
attack_edge = 1
attacktext = list("slashed", "stabbed")
armor = list(melee = 60, bullet = 40, laser = 60, energy = 80, bomb = 25, bio = 100, rad = 100)
attack_sound = 'sound/weapons/rapidslice.ogg'
movement_cooldown = 4
projectiletype = /obj/item/projectile/energy/plasma/vepr
projectilesound = 'sound/weapons/spiderlunge.ogg'
movement_cooldown = 2
ai_holder_type = /datum/ai_holder/simple_mob/ranged
@@ -0,0 +1,29 @@
/mob/living/simple_mob/construct/juggernaut/behemoth/unstoppable
name = "Behemoth"
real_name = "Behemoth"
desc = "The pinnacle of occult technology, Behemoths are nothing shy of both an Immovable Object, and Unstoppable Force."
melee_damage_lower = 45
melee_damage_upper = 55
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
projectiletype = /obj/item/projectile/icicle
/mob/living/simple_mob/construct/juggernaut/behemoth/unstoppable/bullet_act(var/obj/item/projectile/P)
var/reflectchance = 20 - round(P.damage/3)
if(prob(reflectchance))
visible_message("<span class='danger'>The [P.name] gets reflected by [src]'s shell!</span>", \
"<span class='userdanger'>The [P.name] gets reflected by [src]'s shell!</span>")
// Find a turf near or on the original location to bounce to
if(P.starting)
var/new_x = P.starting.x + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
var/new_y = P.starting.y + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
var/turf/curloc = get_turf(src)
// redirect the projectile
P.redirect(new_x, new_y, curloc, src)
P.reflected = 1
return -1 // complete projectile permutation
return (..(P))
@@ -15,10 +15,11 @@
vore_icon_bellies = list("stomach", "neck1", "neck2", "neck3", "neck4")
vore_icons = 0
vore_pounce_chance = 100
vore_pounce_maxhealth = 125
vore_pounce_maxhealth = 200
has_hands = TRUE
adminbus_trash = TRUE //You know what, sure whatever. It's not like anyone's gonna be taking this bird on unga trips to be their gamer backpack, which kinda was the main reason for the trash eater restrictions in the first place anyway.
faction = "neutral"
say_list_type = /datum/say_list/swoopie
/mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/init_vore()
if(!voremob_loaded)
@@ -121,6 +122,21 @@
for(var/obj/O in T)
if(O.clean_blood())
adjust_nutrition(1)
if(has_AI())
if(is_type_in_list(O, edible_trash) && !O.anchored)
put_in_active_hand(O)
break
if(has_AI())
var/obj/item/I = get_active_hand()
if(istype(I))
if(!voremob_loaded)
voremob_loaded = TRUE
init_vore()
eat_trash()
drop_item()
for(var/mob/living/simple_mob/animal/passive/mouse/M in T)
perform_the_nom(src,M,src,src.vore_selected,1)
break
if(istype(T, /turf/simulated))
var/turf/simulated/S = T
if(T.clean_blood())
@@ -128,3 +144,10 @@
if(S.dirt > 50)
S.dirt = 0
adjust_nutrition(1)
/datum/say_list/swoopie
speak = list("Scanning for debris...", "Scanning for dirt...", "Scanning for pests...", "Squawk!")
emote_hear = list("squawks!", "whirrs idly.", "revs up its vacuum.")
emote_see = list("twitches.", "sways.", "stretches its neck.", "stomps idly.")
say_maybe_target = list("Pest detected?")
say_got_target = list("PEST DETECTED!")
@@ -1,6 +1,3 @@
/datum/sprite_accessory/marking
var/hide_body_parts = list()
/datum/sprite_accessory/marking/ch/anthrovirus_ra
name = "Anthro Virus (Right Arm)"
icon_state = "anthrovirus"
@@ -181,4 +178,4 @@
name = "Normal Eyes"
icon_state = "normeyes"
body_parts = list(BP_HEAD)
color_blend_mode = ICON_MULTIPLY
color_blend_mode = ICON_MULTIPLY
@@ -5,6 +5,103 @@
/datum/sprite_accessory/tail/taur/wolf
vore_tail_sprite_variant = "N"
/datum/sprite_accessory/tail/taur/ch
icon = 'icons/mob/vore/taurs_ch.dmi'//Parent which allows us to not need to set icon every time.
/datum/sprite_accessory/tail/taur/ch/zorgoia
name = "Zorgoia (Taur)"
icon_state = "zorgoia"
extra_overlay = "zorgoia_fluff"
/datum/sprite_accessory/tail/taur/ch/zorgoia/fat
name = "Zorgoia (Fat Taur)"
extra_overlay = "zorgoia_fat"
/datum/sprite_accessory/tail/taur/ch/redpanda
name = "Red Panda (Taur)"
icon_state = "redpanda"
/datum/sprite_accessory/tail/taur/ch/redpandadc
name = "Red Panda (Taur dual-color)"
icon_state = "redpanda_dc"
extra_overlay = "redpanda_dc_markings"
/datum/sprite_accessory/tail/taur/ch/wolf/fatwolf_2c/fatwolfalt
name = "Fat Wolf 3-color-alt (Taur)"
icon_state = "fatwolfalt_s"
extra_overlay = "fatwolfalt_markings1"
extra_overlay2 = "fatwolfalt_markings2"
icon_sprite_tag = "wolf"
/datum/sprite_accessory/tail/taur/ch/naga/alt
name = "Naga alt (Taur)"
icon_state = "naga_alt_s"
suit_sprites = 'modular_chomp/icons/mob/taursuits_naga_ch.dmi'
msg_owner_help_walk = "You carefully slither around %prey."
msg_prey_help_walk = "%owner's huge tail slithers past beside you!"
msg_owner_help_run = "You carefully slither around %prey."
msg_prey_help_run = "%owner's huge tail slithers past beside you!"
msg_owner_disarm_run = "Your tail slides over %prey, pushing them down to the ground!"
msg_prey_disarm_run = "%owner's tail slides over you, forcing you down to the ground!"
msg_owner_disarm_walk = "You push down on %prey with your tail, pinning them down under you!"
msg_prey_disarm_walk = "%owner pushes down on you with their tail, pinning you down below them!"
msg_owner_harm_run = "Your heavy tail carelessly slides past %prey, crushing them!"
msg_prey_harm_run = "%owner quickly goes over your body, carelessly crushing you with their heavy tail!"
msg_owner_harm_walk = "Your heavy tail slowly and methodically slides down upon %prey, crushing against the floor below!"
msg_prey_harm_walk = "%owner's thick, heavy tail slowly and methodically slides down upon your body, mercilessly crushing you into the floor below!"
msg_owner_grab_success = "You slither over %prey with your large, thick tail, smushing them against the ground before coiling up around them, trapping them within the tight confines of your tail!"
msg_prey_grab_success = "%owner slithers over you with their large, thick tail, smushing you against the ground before coiling up around you, trapping you within the tight confines of their tail!"
msg_owner_grab_fail = "You squish %prey under your large, thick tail, forcing them onto the ground!"
msg_prey_grab_fail = "%owner pins you under their large, thick tail, forcing you onto the ground!"
msg_prey_stepunder = "You jump over %prey's thick tail."
msg_owner_stepunder = "%owner bounds over your tail."
/datum/sprite_accessory/tail/taur/ch/naga/alt_2c
name = "Naga dual-color alt (Taur)"
icon_state = "naga_alt_s"
extra_overlay = "naga_alt_markings"
suit_sprites = 'modular_chomp/icons/mob/taursuits_naga_ch.dmi'
/datum/sprite_accessory/tail/taur/ch/horse/scoli
name = "Scolipede (Taur)"
icon_state = "scoli_s"
extra_overlay = "scoli_markings1"
extra_overlay2 = "scoli_markings2"
/datum/sprite_accessory/tail/taur/ch/sergal/wheaties
name = "Sergal (Taur)"
icon_state = "sergwheat"
icon_sprite_tag = "wolf"
vore_tail_sprite_variant = "N"
/datum/sprite_accessory/tail/taur/ch/sergal/fatwheaties
name = "Fat Sergal (Taur)"
icon_state = "fatsergal"
icon_sprite_tag = "wolf"
/datum/sprite_accessory/tail/taur/ch/sergal/wheaties_2c
name = "Sergal (Taur, dual-color)"
icon_state = "sergwheat"
extra_overlay = "sergwheat_markings"
icon_sprite_tag = "wolf"
vore_tail_sprite_variant = "N"
/datum/sprite_accessory/tail/taur/ch/sergal/fatwheaties_2c
name = "Fat Sergal (Taur, dual-color)"
icon_state = "fatsergal"
extra_overlay = "sergwheat_markings"
icon_sprite_tag = "wolf"
/datum/sprite_accessory/tail/taur/ch/longvirus
name = "Long Virus (Taur)"
icon_state = "longvirus_s"
@@ -1,3 +1,6 @@
/obj/item/organ/external
var/prosthetic_digi = FALSE //CHOMPStation edit - when it's prosthetic, can it be a digitigrade
//new function to check for markings
/obj/item/organ/external/proc/is_hidden_by_markings()
//code that checked all limbs.
+63 -150
View File
@@ -5,169 +5,82 @@
// this allows limbs to be set properly when being printed in the bioprinter without an owner
// this also allows the preview mannequin to update properly because customisation topic calls don't call a DNA check
if(owner)
digitigrade = owner.digitigrade
digitigrade = owner.digitigrade && (istype(src,/obj/item/organ/external/leg) || istype(src,/obj/item/organ/external/foot))
else if(dna)
digitigrade = dna.digitigrade
digitigrade = dna.digitigrade && (istype(src,/obj/item/organ/external/leg) || istype(src,/obj/item/organ/external/foot))
if( !model && ( istype(src,/obj/item/organ/external/leg) || istype(src,/obj/item/organ/external/foot) ) ) //All leg icons go through here now.
var/robotic_digi = prosthetic_digi && digitigrade //could make it so the prosthetic digi var is more of a "does this limb have a custom digitigrade sprite for its robospriting" but this is fine for now
var/gender = "m"
if(owner && owner.gender == FEMALE)
gender = "f"
if(!force_icon_key)
icon_cache_key = "[icon_name]_[species ? species.get_bodytype() : SPECIES_HUMAN]" //VOREStation Edit
else
icon_cache_key = "[icon_name]_[force_icon_key]"
if(force_icon)
mob_icon = new /icon(force_icon, "[icon_name][gendered_icon ? "_[gender]" : ""]")
else
if(!dna)
mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_[gender]" : ""]")
else
if(!gendered_icon)
gender = null
else
if(dna.GetUIState(DNA_UI_GENDER))
gender = "f"
else
gender = "m"
if(skeletal)
mob_icon = new /icon('icons/mob/human_races/r_skeleton.dmi', "[icon_name][gender ? "_[gender]" : ""]")
else if (robotic >= ORGAN_ROBOT)
mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]")
apply_colouration(mob_icon)
else
if(is_hidden_by_markings())
mob_icon = new /icon('icons/mob/human_races/r_blank.dmi', "[icon_name][gender ? "_[gender]" : ""]")
else
//Use digi icon if digitigrade, otherwise use regular icon. Ternary operator is based.
mob_icon = new /icon(digitigrade ? species.icodigi : species.get_icobase(owner, (status & ORGAN_MUTATED)), "[icon_name][gender ? "_[gender]" : ""]")
apply_colouration(mob_icon)
//Code here is copied from organ_icon.dm line 118 at time of writing (9/20/21), VOREStation edits are left in intentionally, because I think it's worth keeping track of the fact that the code is from Virgo's edits.
//Body markings, actually does not include head this time. Done separately above.
if(!istype(src,/obj/item/organ/external/head))
for(var/M in markings)
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/isdigitype = istype(mark_style,/datum/sprite_accessory/marking/digi)
if(!(digitigrade ^ isdigitype)) //Equivalent to XNOR; this code will only run if either both digitigrade and isdigitype are true, or if both are false.
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit
add_overlay(mark_s) //So when it's not on your body, it has icons
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
if(body_hair && islist(h_col) && h_col.len >= 3)
var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]"
if(!limb_icon_cache[cache_key])
var/icon/I = icon(species.get_icobase(owner), "[icon_name]_[body_hair]")
I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_MULTIPLY) //VOREStation edit
limb_icon_cache[cache_key] = I
mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY)
// VOREStation edit start
if(nail_polish)
var/icon/I = new(nail_polish.icon, nail_polish.icon_state)
I.Blend(nail_polish.color, ICON_MULTIPLY)
add_overlay(I)
mob_icon.Blend(I, ICON_OVERLAY)
icon_cache_key += "_[nail_polish.icon]_[nail_polish.icon_state]_[nail_polish.color]"
// VOREStation edit end
dir = EAST
icon = mob_icon
return mob_icon
var/gender = "m"
if(owner && owner.gender == FEMALE)
gender = "f"
if(!force_icon_key)
icon_cache_key = "[icon_name]_[species ? species.get_bodytype() : SPECIES_HUMAN]" //VOREStation Edit
else
//. = ..()
//due to the wierd fact that this calls the old code, and defining it here makes a duplicate procedure error, i'm gonna have to bring the whole code here and modify it. if there is a more condensed way, it is appreciated.
icon_cache_key = "[icon_name]_[force_icon_key]"
var/gender = "m"
if(owner && owner.gender == FEMALE)
gender = "f"
if(!force_icon_key)
icon_cache_key = "[icon_name]_[species ? species.get_bodytype() : SPECIES_HUMAN]" //VOREStation Edit
if(force_icon && !robotic_digi)
mob_icon = new /icon(force_icon, "[icon_name][gendered_icon ? "_[gender]" : ""]")
else
if(!dna)
mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_[gender]" : ""]")
else
icon_cache_key = "[icon_name]_[force_icon_key]"
if(force_icon)
mob_icon = new /icon(force_icon, "[icon_name][gendered_icon ? "_[gender]" : ""]")
else
if(!dna)
mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_[gender]" : ""]")
if(!gendered_icon)
gender = null
else
if(!gendered_icon)
gender = null
if(dna.GetUIState(DNA_UI_GENDER))
gender = "f"
else
if(dna.GetUIState(DNA_UI_GENDER))
gender = "f"
else
gender = "m"
gender = "m"
if(skeletal)
mob_icon = new /icon('icons/mob/human_races/r_skeleton.dmi', "[icon_name][gender ? "_[gender]" : ""]")
else if (robotic >= ORGAN_ROBOT)
mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]")
if(skeletal)
mob_icon = new /icon('icons/mob/human_races/r_skeleton.dmi', "[icon_name][gender ? "_[gender]" : ""]")
else if (robotic >= ORGAN_ROBOT && !robotic_digi)
mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]")
apply_colouration(mob_icon)
else
if(is_hidden_by_markings())
mob_icon = new /icon('icons/mob/human_races/r_blank.dmi', "[icon_name][gender ? "_[gender]" : ""]")
else
//Use digi icon if digitigrade, otherwise use regular icon. Ternary operator is based.
mob_icon = new /icon(digitigrade ? species.icodigi : species.get_icobase(owner, (status & ORGAN_MUTATED)), "[icon_name][gender ? "_[gender]" : ""]")
apply_colouration(mob_icon)
else
if(is_hidden_by_markings())
mob_icon = new /icon('icons/mob/human_races/r_blank.dmi', "[icon_name][gender ? "_[gender]" : ""]")
else
//Use digi icon if digitigrade, otherwise use regular icon. Ternary operator is based.
mob_icon = new /icon(species.get_icobase(owner, (status & ORGAN_MUTATED)), "[icon_name][gender ? "_[gender]" : ""]")
apply_colouration(mob_icon)
//Body markings, actually does not include head this time. Done separately above.
if(!istype(src,/obj/item/organ/external/head))
for(var/M in markings)
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit
add_overlay(mark_s) //So when it's not on your body, it has icons
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
if (model && !robotic_digi)
icon_cache_key += "_model_[model]"
apply_colouration(mob_icon)
if(body_hair && islist(h_col) && h_col.len >= 3)
var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]"
if(!limb_icon_cache[cache_key])
var/icon/I = icon(species.get_icobase(owner), "[icon_name]_[body_hair]")
I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_MULTIPLY) //VOREStation edit
limb_icon_cache[cache_key] = I
mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY)
//Code here is copied from organ_icon.dm line 118 at time of writing (9/20/21), VOREStation edits are left in intentionally, because I think it's worth keeping track of the fact that the code is from Virgo's edits.
//Body markings, actually does not include head this time. Done separately above.
if((!istype(src,/obj/item/organ/external/head) && !(force_icon && !robotic_digi)) || (model && owner && owner.synth_markings))
for(var/M in markings)
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/isdigitype = istype(mark_style,/datum/sprite_accessory/marking/digi)
if(!(digitigrade ^ isdigitype)) //Equivalent to XNOR; this code will only run if either both digitigrade and isdigitype are true, or if both are false.
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit
add_overlay(mark_s) //So when it's not on your body, it has icons
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
if(body_hair && islist(h_col) && h_col.len >= 3)
var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]"
if(!limb_icon_cache[cache_key])
var/icon/I = icon(species.get_icobase(owner), "[icon_name]_[body_hair]")
I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_MULTIPLY) //VOREStation edit
limb_icon_cache[cache_key] = I
mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY)
// VOREStation edit start
if(nail_polish)
var/icon/I = new(nail_polish.icon, nail_polish.icon_state)
I.Blend(nail_polish.color, ICON_MULTIPLY)
add_overlay(I)
mob_icon.Blend(I, ICON_OVERLAY)
icon_cache_key += "_[nail_polish.icon]_[nail_polish.icon_state]_[nail_polish.color]"
// VOREStation edit end
// VOREStation edit start
if(nail_polish && (force_icon && !robotic_digi))
var/icon/I = new(nail_polish.icon, nail_polish.icon_state)
I.Blend(nail_polish.color, ICON_MULTIPLY)
add_overlay(I)
mob_icon.Blend(I, ICON_OVERLAY)
icon_cache_key += "_[nail_polish.icon]_[nail_polish.icon_state]_[nail_polish.color]"
// VOREStation edit end
if(model)
icon_cache_key += "_model_[model]"
apply_colouration(mob_icon)
if(owner && owner.synth_markings)
for(var/M in markings)
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit
add_overlay(mark_s) //So when it's not on your body, it has icons
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
if(body_hair && islist(h_col) && h_col.len >= 3)
var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]"
if(!limb_icon_cache[cache_key])
var/icon/I = icon(species.get_icobase(owner), "[icon_name]_[body_hair]")
I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_MULTIPLY) //VOREStation edit
limb_icon_cache[cache_key] = I
mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY)
// VOREStation edit ends here
dir = EAST
icon = mob_icon
return mob_icon
dir = EAST
icon = mob_icon
return mob_icon
@@ -125,7 +125,7 @@
icon_state = "meb_m_nu"
matter = list(MAT_STEEL = 400, MAT_GLASS = 80)
self_recharge = TRUE
charge_amount = 120
charge_amount = 60 //2.5%
charge_delay = 75
origin_tech = list(TECH_POWER = 5, TECH_PRECURSOR = 1)
@@ -225,7 +225,7 @@
/obj/item/weapon/cell/device/weapon/recharge/alien/omni
name = "omni weapon power cell"
desc = "A mix between alien technology and phoron tech. Seems to fit in almost any cell slot..."
charge_amount = 240 // 5%.
charge_amount = 120 // 2.5%.
maxcharge = 4800
charge_delay = 50
origin_tech = list(TECH_POWER = 8, TECH_ENGINEERING = 6, TECH_PHORON = 6, TECH_ARCANE = 2, TECH_PRECURSOR = 2)
@@ -3,7 +3,7 @@
desc = "Stuff it with paper and shoot! You'll be a hit at every party."
id = "confetti_cannon"
req_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 3000)
materials = list(MAT_STEEL = 3000, MAT_GLASS = 3000)
build_path = /obj/item/weapon/gun/launcher/confetti_cannon
sort_string = "MAAVD"
@@ -11,34 +11,71 @@
/datum/design/item/weapon/phase/phase_pistol
id = "phasepistol"
req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2, TECH_POWER = 2)
materials = list(DEFAULT_WALL_MATERIAL = 4000, MAT_COPPER = 30)
materials = list(MAT_STEEL = 4000, MAT_GLASS = 500)
build_path = /obj/item/weapon/gun/energy/locked/phasegun/pistol
sort_string = "MACAA"
/datum/design/item/weapon/phase/phase_carbine
id = "phasecarbine"
req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2, TECH_POWER = 2)
materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1500, MAT_COPPER = 40)
materials = list(MAT_STEEL = 6000, MAT_GLASS = 500)
build_path = /obj/item/weapon/gun/energy/locked/phasegun
sort_string = "MACAB"
/datum/design/item/weapon/phase/phase_rifle
id = "phaserifle"
req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3)
materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 2000, "silver" = 500)
materials = list(MAT_STEEL = 7000, MAT_GLASS = 500, MAT_SILVER = 500)
build_path = /obj/item/weapon/gun/energy/locked/phasegun/rifle
sort_string = "MACAC"
/datum/design/item/weapon/phase/phase_cannon
id = "phasecannon"
req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 4, TECH_POWER = 4)
materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 2000, "silver" = 1000, "diamond" = 750)
materials = list(MAT_STEEL = 10000, MAT_GLASS = 2000, MAT_SILVER = 2000, MAT_DIAMOND = 750)
build_path = /obj/item/weapon/gun/energy/locked/phasegun/cannon
sort_string = "MACAD"
/datum/design/item/weapon/phase/frontier_holdout
id = "holdout frontier phaser"
req_tech = list(TECH_COMBAT = 4, TECH_POWER = 7, TECH_MATERIAL = 6, TECH_PHORON = 6)
materials = list(MAT_STEEL = 6000, MAT_GLASS = 900, MAT_DURASTEEL = 100, MAT_METALHYDROGEN = 150, MAT_VERDANTIUM = 100, MAT_PHORON = 1000)
build_path = /obj/item/weapon/gun/energy/locked/frontier/holdout
sort_string = "MACAE"
/datum/design/item/weapon/phase/frontier_phaser
id = "frontier phaser"
req_tech = list(TECH_COMBAT = 4, TECH_POWER = 7, TECH_MATERIAL = 6, TECH_PHORON = 6)
materials = list(MAT_STEEL = 7000, MAT_GLASS = 900, MAT_DURASTEEL = 100, MAT_METALHYDROGEN = 200, MAT_VERDANTIUM = 150, MAT_PHORON = 2000)
build_path = /obj/item/weapon/gun/energy/locked/frontier
sort_string = "MACAF"
/datum/design/item/weapon/phase/frontier_carbine
id = "carbine frontier phaser"
req_tech = list(TECH_COMBAT = 4, TECH_POWER = 8, TECH_MATERIAL = 6, TECH_PHORON = 6)
materials = list(MAT_STEEL = 6500, MAT_GLASS = 900, MAT_DURASTEEL = 150, MAT_METALHYDROGEN = 250, MAT_VERDANTIUM = 200, MAT_PHORON = 4000)
build_path = /obj/item/weapon/gun/energy/locked/frontier/carbine
sort_string = "MACAG"
/datum/design/item/weapon/phase/frontier_rifle
id = "marksman rifle frontier phaser"
req_tech = list(TECH_COMBAT = 4, TECH_POWER = 7, TECH_MATERIAL = 6, TECH_PHORON = 6)
materials = list(MAT_STEEL = 8000, MAT_GLASS = 900, MAT_DURASTEEL = 200, MAT_METALHYDROGEN = 300, MAT_VERDANTIUM = 250, MAT_PHORON = 2000)
build_path = /obj/item/weapon/gun/energy/locked/frontier/rifle
sort_string = "MACAH"
/datum/design/item/weapon/phase/frontier_handbow
id = "handbow frontier phaser"
req_tech = list(TECH_COMBAT = 4, TECH_POWER = 7, TECH_MATERIAL = 6, TECH_PHORON = 6)
materials = list(MAT_STEEL = 5000, MAT_GLASS = 900, MAT_DURASTEEL = 100, MAT_METALHYDROGEN = 200, MAT_VERDANTIUM = 150, MAT_PHORON = 1000)
build_path = /obj/item/weapon/gun/energy/locked/frontier/handbow
sort_string = "MACAI"
//Leathals And any new CHOMP weapons.
/datum/design/item/weapon/gun/projectile/caseless/prototype
id = "caselessrifle"
req_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 5, TECH_PHORON = 5)
materials = list(DEFAULT_WALL_MATERIAL = 7000, "titanium" = 4000)
materials = list(MAT_STEEL = 7000, MAT_TITANIUM = 4000)
build_path = /obj/item/weapon/gun/projectile/caseless/prototype
sort_string = "MACAE"
sort_string = "MACBA"