This commit is contained in:
Putnam3145
2022-05-17 13:22:40 -07:00
1311 changed files with 12771 additions and 10321 deletions
+4 -1
View File
@@ -7,7 +7,7 @@ INITIALIZE_IMMEDIATE(/mob/dead)
move_resist = INFINITY
throwforce = 0
/mob/dead/Initialize()
/mob/dead/Initialize(mapload)
SHOULD_CALL_PARENT(FALSE)
if(flags_1 & INITIALIZED_1)
stack_trace("Warning: [src]([type]) initialized multiple times!")
@@ -121,6 +121,9 @@ INITIALIZE_IMMEDIATE(/mob/dead)
if (isturf(T))
update_z(T.z)
/mob/dead/auto_deadmin_on_login()
return
/mob/dead/Logout()
update_z(null)
return ..()
@@ -19,7 +19,7 @@
//is there a result we want to read from the age gate
var/age_gate_result
/mob/dead/new_player/Initialize()
/mob/dead/new_player/Initialize(mapload)
if(client && SSticker.state == GAME_STATE_STARTUP)
var/atom/movable/screen/splash/S = new(client, TRUE, TRUE)
S.Fade(TRUE)
@@ -762,7 +762,7 @@
client.prefs.scars_list["[cur_scar_index]"] = valid_scars
client.prefs.save_character()
client.prefs.copy_to(H, initial_spawn = TRUE)
H.dna.update_dna_identity()
if(mind)
@@ -166,9 +166,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
QDEL_NULL(spawners_menu)
return ..()
/mob/dead/CanPass(atom/movable/mover, turf/target)
return 1
/*
* This proc will update the icon of the ghost itself, with hair overlays, as well as the ghost image.
* Please call update_icon(icon_state) from now on when you want to update the icon_state of the ghost,
+3 -3
View File
@@ -461,7 +461,7 @@
//any cost it has isn't a worry
/mob/proc/change_number_of_hands(amt)
if(amt < held_items.len)
for(var/i in held_items.len to amt step -1)
for(var/i in held_items.len to (amt + 1) step -1)
dropItemToGround(held_items[i])
held_items.len = amt
@@ -472,14 +472,14 @@
/mob/living/carbon/human/change_number_of_hands(amt)
var/old_limbs = held_items.len
if(amt < old_limbs)
for(var/i in hand_bodyparts.len to amt step -1)
for(var/i in hand_bodyparts.len to (amt + 1) step -1)
var/obj/item/bodypart/BP = hand_bodyparts[i]
BP.dismember()
hand_bodyparts[i] = null
hand_bodyparts.len = amt
else if(amt > old_limbs)
hand_bodyparts.len = amt
for(var/i in old_limbs+1 to amt)
for(var/i in (old_limbs + 1) to amt)
var/path = /obj/item/bodypart/l_arm
if(!(i % 2))
path = /obj/item/bodypart/r_arm
+1 -1
View File
@@ -144,7 +144,7 @@
icon = 'icons/effects/blood.dmi'
item_flags = ABSTRACT
/obj/item/bloodcrawl/Initialize()
/obj/item/bloodcrawl/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
+3 -3
View File
@@ -8,7 +8,7 @@
var/obj/item/radio/radio = null //Let's give it a radio.
var/mob/living/brain/brainmob = null //The current occupant.
var/mob/living/silicon/robot = null //Appears unused.
var/obj/mecha = null //This does not appear to be used outside of reference in mecha.dm.
var/obj/vehicle/sealed/mecha = null //This does not appear to be used outside of reference in mecha.dm.
var/obj/item/organ/brain/brain = null //The actual brain
var/datum/ai_laws/laws = new()
var/force_replace_ai_name = FALSE
@@ -32,7 +32,7 @@
else
. += "mmi_dead"
/obj/item/mmi/Initialize()
/obj/item/mmi/Initialize(mapload)
. = ..()
radio = new(src) //Spawns a radio inside the MMI.
radio.broadcasting = 0 //researching radio mmis turned the robofabs into radios because this didnt start as 0.
@@ -215,7 +215,7 @@
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."
overrides_aicore_laws = TRUE
/obj/item/mmi/syndie/Initialize()
/obj/item/mmi/syndie/Initialize(mapload)
. = ..()
laws = new /datum/ai_laws/syndicate_override()
radio.on = 0
+3 -10
View File
@@ -9,7 +9,7 @@
possible_a_intents = list(INTENT_HELP, INTENT_HARM) //for mechas
speech_span = SPAN_ROBOT
/mob/living/brain/Initialize()
/mob/living/brain/Initialize(mapload)
. = ..()
create_dna(src)
if(stored_dna.blood_type)
@@ -41,7 +41,7 @@
return ..()
/mob/living/brain/update_mobility()
return ((mobility_flags = (container?.in_contents_of(/obj/mecha)? MOBILITY_FLAGS_DEFAULT : NONE)))
return ((mobility_flags = (container?.in_contents_of(/obj/vehicle/sealed/mecha)? MOBILITY_FLAGS_DEFAULT : NONE)))
/mob/living/brain/ex_act(severity, target, origin) //you cant blow up brainmobs because it makes transfer_to() freak out when borgs blow up.
return
@@ -71,13 +71,6 @@
if(stored_dna)
stored_dna.real_name = real_name
/mob/living/brain/ClickOn(atom/A, params)
..()
if(container)
var/obj/mecha/M = container.mecha
if(istype(M))
return M.click_action(A,src,params)
/mob/living/brain/forceMove(atom/destination)
if(container)
return container.forceMove(destination)
@@ -98,7 +91,7 @@
if(!container)
return
if (container.mecha)
var/obj/mecha/M = container.mecha
var/obj/vehicle/sealed/mecha/M = container.mecha
if(M.mouse_pointer)
client.mouse_pointer_icon = M.mouse_pointer
if (client && ranged_ability && ranged_ability.ranged_mousepointer)
+1 -1
View File
@@ -28,7 +28,7 @@ GLOBAL_VAR(posibrain_notify_cooldown)
var/list/possible_names //If you leave this blank, it will use the global posibrain names
var/picked_name
/obj/item/mmi/posibrain/Initialize()
/obj/item/mmi/posibrain/Initialize(mapload)
. = ..()
brainmob = new(src)
var/new_name
@@ -34,7 +34,7 @@
var/static/regex/alien_name_regex = new("alien (larva|sentinel|drone|hunter|praetorian|queen)( \\(\\d+\\))?")
/mob/living/carbon/alien/Initialize()
/mob/living/carbon/alien/Initialize(mapload)
add_verb(src, /mob/living/proc/mob_sleep)
add_verb(src, /mob/living/proc/lay_down)
@@ -17,7 +17,7 @@ Doesn't work on other aliens/AI.*/
action_icon_state = "spell_default"
action_background_icon_state = "bg_alien"
/obj/effect/proc_holder/alien/Initialize()
/obj/effect/proc_holder/alien/Initialize(mapload)
. = ..()
action = new(src)
@@ -6,7 +6,7 @@
icon_state = "aliend"
meleeKnockdownPower = 80
/mob/living/carbon/alien/humanoid/drone/Initialize()
/mob/living/carbon/alien/humanoid/drone/Initialize(mapload)
AddAbility(new/obj/effect/proc_holder/alien/evolve(null))
. = ..()
@@ -5,7 +5,7 @@
health = 250
icon_state = "alienp"
/mob/living/carbon/alien/humanoid/royal/praetorian/Initialize()
/mob/living/carbon/alien/humanoid/royal/praetorian/Initialize(mapload)
real_name = name
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno(src))
AddAbility(new /obj/effect/proc_holder/alien/royal/praetorian/evolve())
@@ -6,7 +6,7 @@
icon_state = "aliens"
meleeSlashHumanPower = 15
/mob/living/carbon/alien/humanoid/sentinel/Initialize()
/mob/living/carbon/alien/humanoid/sentinel/Initialize(mapload)
AddAbility(new /obj/effect/proc_holder/alien/sneak)
. = ..()
@@ -28,7 +28,7 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list(
)))
//This is fine right now, if we're adding organ specific damage this needs to be updated
/mob/living/carbon/alien/humanoid/Initialize()
/mob/living/carbon/alien/humanoid/Initialize(mapload)
AddAbility(new/obj/effect/proc_holder/alien/regurgitate(null))
. = ..()
@@ -28,7 +28,7 @@
icon_state = "alienq"
var/datum/action/small_sprite/smallsprite = new/datum/action/small_sprite/queen()
/mob/living/carbon/alien/humanoid/royal/queen/Initialize()
/mob/living/carbon/alien/humanoid/royal/queen/Initialize(mapload)
//there should only be one queen
for(var/mob/living/carbon/alien/humanoid/royal/queen/Q in GLOB.carbon_list)
if(Q == src)
@@ -110,7 +110,7 @@
item_flags = ABSTRACT | DROPDEL
icon = 'icons/mob/alien.dmi'
/obj/item/queenpromote/Initialize()
/obj/item/queenpromote/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
@@ -21,7 +21,7 @@
bodyparts = list(/obj/item/bodypart/chest/larva, /obj/item/bodypart/head/larva)
//This is fine right now, if we're adding organ specific damage this needs to be updated
/mob/living/carbon/alien/larva/Initialize()
/mob/living/carbon/alien/larva/Initialize(mapload)
AddAbility(new/obj/effect/proc_holder/alien/hide(null))
AddAbility(new/obj/effect/proc_holder/alien/larva_evolve(null))
@@ -4,7 +4,7 @@
var/list/alien_powers = list()
organ_flags = ORGAN_NO_SPOIL|ORGAN_EDIBLE
/obj/item/organ/alien/Initialize()
/obj/item/organ/alien/Initialize(mapload)
. = ..()
for(var/A in alien_powers)
if(ispath(A))
+1 -1
View File
@@ -1,7 +1,7 @@
/mob/living/carbon
blood_volume = BLOOD_VOLUME_NORMAL
/mob/living/carbon/Initialize()
/mob/living/carbon/Initialize(mapload)
. = ..()
create_reagents(1000, NONE, NO_REAGENTS_VALUE)
update_body_parts() //to update the carbon's new bodyparts appearance
@@ -209,7 +209,7 @@
if(!parts.len)
return
var/obj/item/bodypart/picked = pick(parts)
if(picked.receive_damage(brute, burn, stamina,check_armor ? run_armor_check(picked, (brute ? "melee" : burn ? "fire" : stamina ? "bullet" : null)) : FALSE, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness))
if(picked.receive_damage(brute, burn, stamina,check_armor ? run_armor_check(picked, (brute ? MELEE : burn ? FIRE : stamina ? BULLET : null)) : FALSE, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness))
update_damage_overlays()
//Heal MANY bodyparts, in random order
@@ -43,10 +43,6 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift)
if(client && !suiciding && !(client in GLOB.dead_players_during_shift))
GLOB.dead_players_during_shift += client
GLOB.deaths_during_shift++
if(ismecha(loc))
var/obj/mecha/M = loc
if(M.occupant == src)
M.go_out()
if(!QDELETED(dna)) //The gibbed param is bit redundant here since dna won't exist at this point if they got deleted.
dna.species.spec_death(gibbed, src)
@@ -6,7 +6,7 @@
/datum/emote/living/carbon/human/cry/run_emote(mob/user, params)
. = ..()
if(. && isipcperson(user))
if(. && isrobotic(user))
do_fake_sparks(5,FALSE,user)
/datum/emote/living/carbon/human/dap
@@ -5,7 +5,7 @@
icon_state = "caucasian_m"
SET_APPEARANCE_FLAGS(KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE)
/mob/living/carbon/human/Initialize()
/mob/living/carbon/human/Initialize(mapload)
add_verb(src, /mob/living/proc/mob_sleep)
add_verb(src, /mob/living/proc/lay_down)
add_verb(src, /mob/living/carbon/human/verb/underwear_toggle)
@@ -903,7 +903,7 @@
/mob/living/carbon/human/species
var/race = null
/mob/living/carbon/human/species/Initialize()
/mob/living/carbon/human/species/Initialize(mapload)
. = ..()
set_species(race)
@@ -53,7 +53,7 @@
dna.species.on_hit(P, src)
/mob/living/carbon/human/bullet_act(obj/item/projectile/P, def_zone)
/mob/living/carbon/human/bullet_act(obj/item/projectile/P, def_zone, piercing_hit = FALSE)
if(dna && dna.species)
var/spec_return = dna.species.bullet_act(P, src)
if(spec_return)
@@ -61,7 +61,7 @@
if(mind) //martial art stuff
if(mind.martial_art && mind.martial_art.can_use(src)) //Some martial arts users can deflect projectiles!
var/martial_art_result = mind.martial_art.on_projectile_hit(src, P, def_zone)
var/martial_art_result = mind.martial_art.on_projectile_hit(src, P, def_zone, piercing_hit)
if(!(martial_art_result == BULLET_ACT_HIT))
return martial_art_result
return ..()
@@ -163,7 +163,7 @@
if(can_inject(M, 1, affecting))//Thick suits can stop monkey bites.
if(..()) //successful monkey bite, this handles disease contraction.
var/damage = rand(1, 3)
apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, "melee"))
apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, MELEE))
return 1
/mob/living/carbon/human/attack_alien(mob/living/carbon/alien/humanoid/M)
@@ -183,7 +183,7 @@
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
if(!affecting)
affecting = get_bodypart(BODY_ZONE_CHEST)
var/armor_block = run_armor_check(affecting, "melee", null, null,10)
var/armor_block = run_armor_check(affecting, MELEE, null, null,10)
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
visible_message("<span class='danger'>[M] has slashed at [src]!</span>", \
@@ -219,7 +219,7 @@
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(L.zone_selected))
if(!affecting)
affecting = get_bodypart(BODY_ZONE_CHEST)
var/armor_block = run_armor_check(affecting, "melee")
var/armor_block = run_armor_check(affecting, MELEE)
apply_damage(damage, BRUTE, affecting, armor_block)
@@ -233,7 +233,7 @@
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
if(!affecting)
affecting = get_bodypart(BODY_ZONE_CHEST)
var/armor = run_armor_check(affecting, "melee", armour_penetration = M.armour_penetration)
var/armor = run_armor_check(affecting, MELEE, armour_penetration = M.armour_penetration)
apply_damage(damage, M.melee_damage_type, affecting, armor, wound_bonus = M.wound_bonus, bare_wound_bonus = M.bare_wound_bonus, sharpness = M.sharpness)
/mob/living/carbon/human/attack_slime(mob/living/simple_animal/slime/M)
@@ -253,51 +253,9 @@
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
if(!affecting)
affecting = get_bodypart(BODY_ZONE_CHEST)
var/armor_block = run_armor_check(affecting, "melee")
var/armor_block = run_armor_check(affecting, MELEE)
apply_damage(damage, BRUTE, affecting, armor_block, wound_bonus=wound_mod)
/mob/living/carbon/human/mech_melee_attack(obj/mecha/M)
if(M.occupant.a_intent == INTENT_HARM)
if(HAS_TRAIT(M.occupant, TRAIT_PACIFISM))
to_chat(M.occupant, "<span class='warning'>You don't want to harm other living beings!</span>")
return
M.do_attack_animation(src)
if(M.damtype == "brute")
step_away(src,M,15)
var/obj/item/bodypart/temp = get_bodypart(pick(BODY_ZONE_CHEST, BODY_ZONE_CHEST, BODY_ZONE_CHEST, BODY_ZONE_HEAD))
if(temp)
var/update = 0
var/dmg = rand(M.force/2, M.force)
var/atom/throw_target = get_edge_target_turf(src, M.dir)
switch(M.damtype)
if("brute")
if(M.force > 35) // durand and other heavy mechas
DefaultCombatKnockdown(50)
src.throw_at(throw_target, rand(1,5), 7)
else if(M.force >= 20 && CHECK_MOBILITY(src, MOBILITY_STAND)) // lightweight mechas like gygax
DefaultCombatKnockdown(30)
src.throw_at(throw_target, rand(1,3), 7)
update |= temp.receive_damage(dmg, 0)
playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
if("fire")
update |= temp.receive_damage(0, dmg)
playsound(src, 'sound/items/welder.ogg', 50, 1)
if("tox")
M.mech_toxin_damage(src)
else
return
if(update)
update_damage_overlays()
updatehealth()
visible_message("<span class='danger'>[M.name] has hit [src]!</span>", \
"<span class='userdanger'>[M.name] has hit you!</span>", null, COMBAT_MESSAGE_RANGE, target = M,
target_message = "<span class='danger'>You have hit [src]!</span>")
log_combat(M.occupant, src, "attacked", M, "(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])")
else
..()
/mob/living/carbon/human/ex_act(severity, target, origin)
if(TRAIT_BOMBIMMUNE in dna.species.species_traits)
@@ -307,7 +265,7 @@
return
var/brute_loss = 0
var/burn_loss = 0
var/bomb_armor = getarmor(null, "bomb")
var/bomb_armor = getarmor(null, BOMB)
//200 max knockdown for EXPLODE_HEAVY
//160 max knockdown for EXPLODE_LIGHT
@@ -328,7 +286,7 @@
brute_loss = 500
var/atom/throw_target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src)))
throw_at(throw_target, 200, 4)
damage_clothes(400 - bomb_armor, BRUTE, "bomb")
damage_clothes(400 - bomb_armor, BRUTE, BOMB)
if (EXPLODE_HEAVY)
brute_loss = 60
@@ -336,7 +294,7 @@
if(bomb_armor)
brute_loss = 30*(2 - round(bomb_armor*0.01, 0.05))
burn_loss = brute_loss //damage gets reduced from 120 to up to 60 combined brute+burn
damage_clothes(200 - bomb_armor, BRUTE, "bomb")
damage_clothes(200 - bomb_armor, BRUTE, BOMB)
if (!istype(ears, /obj/item/clothing/ears/earmuffs))
adjustEarDamage(30, 120)
Unconscious(20) //short amount of time for follow up attacks against elusive enemies like wizards
@@ -347,7 +305,7 @@
brute_loss = 30
if(bomb_armor)
brute_loss = 15*(2 - round(bomb_armor*0.01, 0.05))
damage_clothes(max(50 - bomb_armor, 0), BRUTE, "bomb")
damage_clothes(max(50 - bomb_armor, 0), BRUTE, BOMB)
if (!istype(ears, /obj/item/clothing/ears/earmuffs))
adjustEarDamage(15,60)
Knockdown((160 - (bomb_armor * 1.6)) / 4) //100 bomb armor will prevent knockdown altogether
@@ -360,7 +318,7 @@
var/max_limb_loss = round(4/severity) //so you don't lose four limbs at severity 3.
for(var/X in bodyparts)
var/obj/item/bodypart/BP = X
if(prob(50/severity) && !prob(getarmor(BP, "bomb")) && BP.body_zone != BODY_ZONE_HEAD && BP.body_zone != BODY_ZONE_CHEST)
if(prob(50/severity) && !prob(getarmor(BP, BOMB)) && BP.body_zone != BODY_ZONE_HEAD && BP.body_zone != BODY_ZONE_CHEST)
BP.brute_dam = BP.max_damage
BP.dismember()
max_limb_loss--
@@ -374,7 +332,7 @@
show_message("<span class='userdanger'>The blob attacks you!</span>")
var/dam_zone = pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
apply_damage(5, BRUTE, affecting, run_armor_check(affecting, "melee"))
apply_damage(5, BRUTE, affecting, run_armor_check(affecting, MELEE))
///Calculates the siemens coeff based on clothing and species, can also restart hearts.
@@ -22,7 +22,7 @@
/datum/action/innate/ability/humanoid_customization/proc/change_form()
var/mob/living/carbon/human/H = owner
var/select_alteration = input(owner, "Select what part of your form to alter", "Form Alteration", "cancel") in list("Body Color", "Eye Color","Hair Style", "Genitals", "Tail", "Snout", "Markings", "Ears", "Taur body", "Penis", "Vagina", "Penis Length", "Breast Size", "Breast Shape", "Cancel")
var/select_alteration = input(owner, "Select what part of your form to alter", "Form Alteration", "cancel") in list("Body Color", "Eye Color","Hair Style", "Genitals", "Tail", "Snout", "Wings", "Markings", "Ears", "Taur body", "Penis", "Vagina", "Penis Length", "Breast Size", "Breast Shape", "Butt Size", "Cancel")
if(select_alteration == "Body Color")
var/new_color = input(owner, "Choose your skin color:", "Race change","#"+H.dna.features["mcolor"]) as color|null
@@ -116,6 +116,25 @@
if(new_snout)
H.dna.features["mam_snouts"] = new_snout
H.update_body()
else if (select_alteration == "Wings")
var/new_color = input(owner, "Choose your wing color:", "Race change","#"+H.dna.features["wings_color"]) as color|null
if(new_color)
H.dna.features["wings_color"] = sanitize_hexcolor(new_color, 6)
H.update_body()
H.update_hair()
var/list/snowflake_wings_list = list("Normal" = null)
for(var/path in GLOB.deco_wings_list)
var/datum/sprite_accessory/deco_wings/instance = GLOB.deco_wings_list[path]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
snowflake_wings_list[S.name] = path
var/new_wings
new_wings = input(owner, "Choose your character's wings:", "Wing Alteration") as null|anything in snowflake_wings_list
if(new_wings)
H.dna.features["deco_wings"] = new_wings
H.update_body()
else if (select_alteration == "Markings")
var/list/snowflake_markings_list = list("None")
@@ -227,5 +246,17 @@
H.apply_overlay()
H.give_genital(/obj/item/organ/genital/breasts)
else if (select_alteration == "Butt Size")
for(var/obj/item/organ/genital/butt/X in H.internal_organs)
qdel(X)
var/min_B = CONFIG_GET(number/butt_min_size_prefs)
var/max_B = CONFIG_GET(number/butt_max_size_prefs)
var/new_length = input(owner, "Butt size:\n([min_B]-[max_B])", "Genital Alteration") as num|null
if(new_length)
H.dna.features["butt_size"] = clamp(round(new_length), min_B, max_B)
H.update_genitals()
H.apply_overlay()
H.give_genital(/obj/item/organ/genital/butt)
else
return
@@ -1696,7 +1696,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
return FALSE
var/armor_block = target.run_armor_check(affecting, "melee")
var/armor_block = target.run_armor_check(affecting, MELEE)
playsound(target.loc, user.dna.species.attack_sound_override || attack_sound, 25, 1, -1)
target.visible_message("<span class='danger'>[user] [atk_verb]ed [target]!</span>", \
"<span class='userdanger'>[user] [atk_verb]ed you!</span>", null, COMBAT_MESSAGE_RANGE, null, \
@@ -1905,7 +1905,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
hit_area = affecting.name
var/def_zone = affecting.body_zone
var/armor_block = H.run_armor_check(affecting, "melee", "<span class='notice'>Your armor has protected your [hit_area].</span>", "<span class='notice'>Your armor has softened a hit to your [hit_area].</span>",I.armour_penetration)
var/armor_block = H.run_armor_check(affecting, MELEE, "<span class='notice'>Your armor has protected your [hit_area].</span>", "<span class='notice'>Your armor has softened a hit to your [hit_area].</span>",I.armour_penetration)
armor_block = min(90,armor_block) //cap damage reduction at 90%
var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords)
var/Iwound_bonus = I.wound_bonus
@@ -2404,7 +2404,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
for(var/X in burning_items)
var/obj/item/I = X
if(!(I.resistance_flags & FIRE_PROOF))
I.take_damage(H.fire_stacks, BURN, "fire", 0)
I.take_damage(H.fire_stacks, BURN, FIRE, 0)
var/thermal_protection = H.easy_thermal_protection()
@@ -347,7 +347,7 @@
/datum/species/golem/sand/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
if(!(P.original == H && P.firer == H))
if(P.flag == "bullet" || P.flag == "bomb")
if(P.flag == BULLET || P.flag == BOMB)
playsound(H, 'sound/effects/shovel_dig.ogg', 70, 1)
H.visible_message("<span class='danger'>The [P.name] sinks harmlessly in [H]'s sandy body!</span>", \
"<span class='userdanger'>The [P.name] sinks harmlessly in [H]'s sandy body!</span>")
@@ -379,7 +379,7 @@
/datum/species/golem/glass/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
if(!(P.original == H && P.firer == H)) //self-shots don't reflect
if(P.flag == "laser" || P.flag == "energy")
if(P.flag == LASER || P.flag == ENERGY)
H.visible_message("<span class='danger'>The [P.name] gets reflected by [H]'s glass skin!</span>", \
"<span class='userdanger'>The [P.name] gets reflected by [H]'s glass skin!</span>")
if(P.starting)
@@ -741,7 +741,7 @@
name = "pile of bandages"
desc = "It emits a strange aura, as if there was still life within it..."
max_integrity = 50
armor = list("melee" = 90, "bullet" = 90, "laser" = 25, "energy" = 80, "bomb" = 50, "bio" = 100, "fire" = -50, "acid" = -50)
armor = list(MELEE = 90, BULLET = 90, LASER = 25, ENERGY = 80, BOMB = 50, BIO = 100, FIRE = -50, ACID = -50)
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "pile_bandages"
resistance_flags = FLAMMABLE
@@ -829,7 +829,7 @@
/datum/species/golem/bronze/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
if(!(world.time > last_gong_time + gong_cooldown))
return ..()
if(P.flag == "bullet" || P.flag == "bomb")
if(P.flag == BULLET || P.flag == BOMB)
gong(H)
return ..()
@@ -474,7 +474,7 @@
light_color = "#FFFFFF"
light_range = LUMINESCENT_DEFAULT_GLOW
/obj/effect/dummy/luminescent_glow/Initialize()
/obj/effect/dummy/luminescent_glow/Initialize(mapload)
. = ..()
if(!isliving(loc))
return INITIALIZE_HINT_QDEL
@@ -168,7 +168,7 @@
sharpness = SHARP_EDGED
total_mass = TOTAL_MASS_HAND_REPLACEMENT
/obj/item/light_eater/Initialize()
/obj/item/light_eater/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
AddComponent(/datum/component/butchering, 80, 70)
@@ -211,7 +211,7 @@
visible_message("<span class='danger'>[S] is disintegrated by [src]!</span>")
else if(AM.light_range && AM.light_power && !(istype(AM, /obj/machinery/power/apc) || istype(AM, /obj/machinery/airalarm)))
var/obj/target_object = AM
target_object.take_damage(force * 5, BRUTE, "melee", 0)
target_object.take_damage(force * 5, BRUTE, MELEE, 0)
/obj/item/light_eater/proc/disintegrate(obj/item/O)
@@ -162,7 +162,7 @@
for(var/X in burning_items)
var/obj/item/I = X
if(!(I.resistance_flags & FIRE_PROOF))
I.take_damage(fire_stacks, BURN, "fire", 0)
I.take_damage(fire_stacks, BURN, FIRE, 0)
adjust_bodytemperature(BODYTEMP_HEATING_MAX)
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire)
@@ -180,7 +180,7 @@ GLOBAL_LIST_INIT(strippable_monkey_items, create_strippable_list(list(
/mob/living/carbon/monkey/angry
aggressive = TRUE
/mob/living/carbon/monkey/angry/Initialize()
/mob/living/carbon/monkey/angry/Initialize(mapload)
. = ..()
if(prob(10))
var/obj/item/clothing/head/helmet/justice/escape/helmet = new(src)
@@ -195,14 +195,14 @@
if (EXPLODE_HEAVY)
take_overall_damage(60, 60)
damage_clothes(200, BRUTE, "bomb")
damage_clothes(200, BRUTE, BOMB)
adjustEarDamage(30, 120)
if(prob(70))
Unconscious(200)
if(EXPLODE_LIGHT)
take_overall_damage(30, 0)
damage_clothes(50, BRUTE, "bomb")
damage_clothes(50, BRUTE, BOMB)
adjustEarDamage(15,60)
if (prob(50))
Unconscious(160)
@@ -9,7 +9,7 @@
var/list/pet_monkey_names = list("Pun Pun", "Bubbles", "Mojo", "George", "Darwin", "Aldo", "Caeser", "Kanzi", "Kong", "Terk", "Grodd", "Mala", "Bojangles", "Coco", "Able", "Baker", "Scatter", "Norbit", "Travis")
var/list/rare_pet_monkey_names = list("Professor Bobo", "Deempisi's Revenge", "Furious George", "King Louie", "Dr. Zaius", "Jimmy Rustles", "Dinner", "Lanky")
/mob/living/carbon/monkey/punpun/Initialize()
/mob/living/carbon/monkey/punpun/Initialize(mapload)
Read_Memory()
if(ancestor_name)
name = ancestor_name
+1 -1
View File
@@ -5,7 +5,7 @@
/datum/emote/living/blush/run_emote(mob/user, params)
. = ..()
if(. && isipcperson(user))
if(. && isrobotic(user))
do_fake_sparks(5,FALSE,user)
/datum/emote/living/bow
+3 -4
View File
@@ -6,13 +6,13 @@
SHOULD_NOT_SLEEP(TRUE)
if(mob_transforming)
return
. = SEND_SIGNAL(src, COMSIG_LIVING_LIFE, seconds, times_fired)
if(!(. & COMPONENT_INTERRUPT_LIFE_PHYSICAL))
PhysicalLife(seconds, times_fired)
if(!(. & COMPONENT_INTERRUPT_LIFE_BIOLOGICAL))
BiologicalLife(seconds, times_fired)
if(!(. & COMPONET_INTERRUPT_STATUS_EFFECTS))
handle_status_effects() //all special effects, stun, knockdown, jitteryness, hallucination, sleeping, etc
// CODE BELOW SHOULD ONLY BE THINGS THAT SHOULD HAPPEN NO MATTER WHAT AND CAN NOT BE SUSPENDED!
// Otherwise, it goes into one of the two split Life procs!
@@ -69,9 +69,8 @@
handle_block_parry(seconds)
// These two MIGHT need to be moved to base Life() if we get any in the future that's a "physical" effect that needs to fire even while in stasis.
handle_traits() // eye, ear, brain damages
handle_status_effects() //all special effects, stun, knockdown, jitteryness, hallucination, sleeping, etc
return TRUE
/**
+5 -5
View File
@@ -1,4 +1,4 @@
/mob/living/Initialize()
/mob/living/Initialize(mapload)
. = ..()
if(unique_name)
name = "[name] ([rand(1, 1000)])"
@@ -433,8 +433,8 @@
to_chat(src, "<span class='notice'>You have given up life and succumbed to death.</span>")
death()
/mob/living/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, check_immobilized = FALSE)
if(stat || IsUnconscious() || IsStun() || IsParalyzed() || (combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (check_immobilized && IsImmobilized()) || (!ignore_restraints && restrained(ignore_grab)))
/mob/living/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, check_immobilized = FALSE, ignore_stasis = FALSE)
if(stat || IsUnconscious() || IsStun() || IsParalyzed() || (combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (check_immobilized && IsImmobilized()) || (!ignore_restraints && restrained(ignore_grab)) || (!ignore_stasis && IS_IN_STASIS(src)))
return TRUE
/mob/living/canUseStorage()
@@ -1124,7 +1124,7 @@
amount -= RAD_BACKGROUND_RADIATION // This will always be at least 1 because of how skin protection is calculated
var/blocked = getarmor(null, "rad")
var/blocked = getarmor(null, RAD)
if(amount > RAD_BURN_THRESHOLD)
apply_damage((amount-RAD_BURN_THRESHOLD)/RAD_BURN_THRESHOLD, BURN, null, blocked)
@@ -1153,7 +1153,7 @@
visible_message("<span class='warning'>[src] catches fire!</span>", \
"<span class='userdanger'>You're set on fire!</span>")
new/obj/effect/dummy/lighting_obj/moblight/fire(src)
throw_alert("fire", /atom/movable/screen/alert/fire)
throw_alert(FIRE, /atom/movable/screen/alert/fire)
update_fire()
SEND_SIGNAL(src, COMSIG_LIVING_IGNITED,src)
return TRUE
+4 -37
View File
@@ -1,5 +1,5 @@
/mob/living/proc/run_armor_check(def_zone = null, attack_flag = "melee", absorb_text = "Your armor absorbs the blow!", soften_text = "Your armor softens the blow!", armour_penetration, penetrated_text = "Your armor was penetrated!", silent=FALSE)
/mob/living/proc/run_armor_check(def_zone = null, attack_flag = MELEE, absorb_text = "Your armor absorbs the blow!", soften_text = "Your armor softens the blow!", armour_penetration, penetrated_text = "Your armor was penetrated!", silent=FALSE)
var/armor = getarmor(def_zone, attack_flag)
if(silent)
@@ -68,7 +68,7 @@
else
CRASH("Invalid rediretion mode [redirection_mode]")
/mob/living/bullet_act(obj/item/projectile/P, def_zone)
/mob/living/bullet_act(obj/item/projectile/P, def_zone, piercing_hit = FALSE)
var/totaldamage = P.damage
var/final_percent = 0
if(P.original != src || P.firer != src) //try to block or reflect the bullet, can't do so when shooting oneself
@@ -81,7 +81,7 @@
if(returned & BLOCK_REDIRECTED)
return BULLET_ACT_FORCE_PIERCE
if(returned & BLOCK_SUCCESS)
P.on_hit(src, final_percent, def_zone)
P.on_hit(src, final_percent, def_zone, piercing_hit)
return BULLET_ACT_BLOCK
totaldamage = block_calculate_resultant_damage(totaldamage, returnlist)
var/armor = run_armor_check(def_zone, P.flag, null, null, P.armour_penetration, null)
@@ -141,7 +141,7 @@
"<span class='userdanger'>You're hit by [I]!</span>")
if(!I.throwforce)
return
var/armor = run_armor_check(impacting_zone, "melee", "Your armor has protected your [parse_zone(impacting_zone)].", "Your armor has softened hit to your [parse_zone(impacting_zone)].",I.armour_penetration)
var/armor = run_armor_check(impacting_zone, MELEE, "Your armor has protected your [parse_zone(impacting_zone)].", "Your armor has softened hit to your [parse_zone(impacting_zone)].",I.armour_penetration)
apply_damage(I.throwforce, dtype, impacting_zone, armor, sharpness=I.get_sharpness(), wound_bonus=(nosell_hit * CANT_WOUND))
else
return 1
@@ -149,39 +149,6 @@
playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
..()
/mob/living/mech_melee_attack(obj/mecha/M)
if(M.occupant.a_intent == INTENT_HARM)
if(HAS_TRAIT(M.occupant, TRAIT_PACIFISM))
to_chat(M.occupant, "<span class='warning'>You don't want to harm other living beings!</span>")
return
M.do_attack_animation(src)
if(M.damtype == "brute")
step_away(src,M,15)
switch(M.damtype)
if(BRUTE)
Unconscious(20)
take_overall_damage(rand(M.force/2, M.force))
playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
if(BURN)
take_overall_damage(0, rand(M.force/2, M.force))
playsound(src, 'sound/items/welder.ogg', 50, 1)
if(TOX)
M.mech_toxin_damage(src)
else
return
updatehealth()
visible_message("<span class='danger'>[M.name] has hit [src]!</span>", \
"<span class='userdanger'>[M.name] has hit you!</span>", null, COMBAT_MESSAGE_RANGE, null,
M.occupant, "<span class='danger'>You hit [src] with your [M.name]!</span>")
log_combat(M.occupant, src, "attacked", M, "(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])")
else
step_away(src,M)
log_combat(M.occupant, src, "pushed", M)
visible_message("<span class='warning'>[M] pushes [src] out of the way.</span>", \
"<span class='warning'>[M] pushes you out of the way.</span>", null, COMBAT_MESSAGE_RANGE, null,
M.occupant, "<span class='warning'>You push [src] out of the way with your [M.name].</span>")
/mob/living/fire_act()
adjust_fire_stacks(3)
IgniteMob()
+5 -7
View File
@@ -20,12 +20,10 @@
/mob/living/proc/update_density()
density = !lying && !HAS_TRAIT(src, TRAIT_LIVING_NO_DENSITY)
/mob/living/CanPass(atom/movable/mover, turf/target)
if((mover.pass_flags & PASSMOB))
return TRUE
if(istype(mover, /obj/item/projectile))
var/obj/item/projectile/P = mover
return !P.can_hit_target(src, P.permutated, src == P.original, TRUE)
/mob/living/CanAllowThrough(atom/movable/mover, turf/target)
. = ..()
if(.)
return
if(mover.throwing)
return (!density || lying)
if(buckled == mover)
@@ -41,7 +39,7 @@
var/mob/living/L = mover //typecast first, check isliving and only check this if living using short circuit
if(isliving(L) && lying && L.lying) //if we're both lying down and aren't already being thrown/shipped around, don't pass
return FALSE
return (!density || (isliving(mover)? L.can_move_under_living(src) : !mover.density))
return (isliving(mover)? L.can_move_under_living(src) : !mover.density)
/mob/living/toggle_move_intent()
. = ..()
+2 -2
View File
@@ -39,7 +39,7 @@
var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list())
var/viewalerts = 0
var/icon/holo_icon//Female is assigned when AI is created.
var/obj/mecha/controlled_mech //For controlled_mech a mech, to determine whether to relaymove or use the AI eye.
var/obj/vehicle/sealed/mecha/controlled_mech //For controlled_mech a mech, to determine whether to relaymove or use the AI eye.
var/radio_enabled = TRUE //Determins if a carded AI can speak with its built in radio or not.
radiomod = ";" //AIs will, by default, state their laws on the internal radio.
var/obj/item/pda/ai/aiPDA
@@ -408,7 +408,7 @@
return
if (href_list["ai_take_control"]) //Mech domination
var/obj/mecha/M = locate(href_list["ai_take_control"])
var/obj/vehicle/sealed/mecha/M = locate(href_list["ai_take_control"])
if(controlled_mech)
to_chat(src, "<span class='warning'>You are already loaded into an onboard computer!</span>")
return
+4 -6
View File
@@ -2,6 +2,10 @@
if(stat == DEAD)
return
if(!gibbed)
// Will update all AI status displays with a blue screen of death
INVOKE_ASYNC(src, .proc/emote, "bsod")
. = ..()
var/old_icon = icon_state
@@ -29,12 +33,6 @@
spawn(10)
explosion(src.loc, 3, 6, 12, 15)
if(src.key)
for(var/each in GLOB.ai_status_displays) //change status
var/obj/machinery/status_display/ai/O = each
O.mode = 2
O.update()
if(istype(loc, /obj/item/aicard/aitater))
loc.icon_state = "aitater-404"
else if(istype(loc, /obj/item/aicard/aispook))
+101
View File
@@ -0,0 +1,101 @@
/datum/emote/ai
mob_type_allowed_typecache = /mob/living/silicon/ai
mob_type_blacklist_typecache = list()
/datum/emote/ai/emotion_display
key = "blank"
var/emotion = AI_EMOTION_BLANK
/datum/emote/ai/emotion_display/run_emote(mob/user, params, type_override, intentional)
. = ..()
if(!.)
return
var/mob/living/silicon/ai/ai = user
var/turf/ai_turf = get_turf(ai)
for(var/_display in GLOB.ai_status_displays)
var/obj/machinery/status_display/ai/ai_display = _display
var/turf/display_turf = get_turf(ai_display)
// Derelict AIs can't affect station displays.
// TODO does this need to be made multiZ aware?
if(ai_turf.z != display_turf.z)
continue
ai_display.emotion = emotion
ai_display.update()
/datum/emote/ai/emotion_display/very_happy
key = "veryhappy"
emotion = AI_EMOTION_VERY_HAPPY
/datum/emote/ai/emotion_display/happy
key = "happy"
emotion = AI_EMOTION_HAPPY
/datum/emote/ai/emotion_display/neutral
key = "neutral"
emotion = AI_EMOTION_NEUTRAL
/datum/emote/ai/emotion_display/unsure
key = "unsure"
emotion = AI_EMOTION_UNSURE
/datum/emote/ai/emotion_display/confused
key = "confused"
emotion = AI_EMOTION_CONFUSED
/datum/emote/ai/emotion_display/sad
key = "sad"
emotion = AI_EMOTION_SAD
/datum/emote/ai/emotion_display/bsod
key = "bsod"
emotion = AI_EMOTION_BSOD
/datum/emote/ai/emotion_display/trollface
key = "trollface"
emotion = AI_EMOTION_PROBLEMS
/datum/emote/ai/emotion_display/awesome
key = "awesome"
emotion = AI_EMOTION_AWESOME
/datum/emote/ai/emotion_display/dorfy
key = "dorfy"
emotion = AI_EMOTION_DORFY
/datum/emote/ai/emotion_display/thinking
key = "thinking"
emotion = AI_EMOTION_THINKING
/datum/emote/ai/emotion_display/facepalm
key = "facepalm"
key_third_person = "facepalms"
emotion = AI_EMOTION_FACEPALM
/datum/emote/ai/emotion_display/friend_computer
key = "friendcomputer"
emotion = AI_EMOTION_FRIEND_COMPUTER
/datum/emote/ai/emotion_display/friend_computer/run_emote(mob/user, params, type_override, intentional)
. = ..()
if(!.)
return
var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS)
if(!frequency)
return
var/datum/signal/status_signal = new(list("command" = "friendcomputer"))
frequency.post_signal(src, status_signal)
/datum/emote/ai/emotion_display/blue_glow
key = "blueglow"
emotion = AI_EMOTION_BLUE_GLOW
/datum/emote/ai/emotion_display/red_glow
key = "redglow"
emotion = AI_EMOTION_RED_GLOW
@@ -18,7 +18,7 @@
var/ai_detector_visible = TRUE
var/ai_detector_color = COLOR_RED
/mob/camera/aiEye/Initialize()
/mob/camera/aiEye/Initialize(mapload)
. = ..()
GLOB.aiEyes += src
update_ai_detect_hud()
+2 -2
View File
@@ -53,11 +53,11 @@
if(NONE)
return FALSE
if(POWER_REQ_ALL)
return !T || !A || ((!A.powered(EQUIP) || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha)))
return !T || !A || ((!A.powered(EQUIP) || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/vehicle/sealed/mecha)))
if(POWER_REQ_CLOCKCULT)
for(var/obj/effect/clockwork/sigil/transmission/ST in range(src, SIGIL_ACCESS_RANGE))
return FALSE
return !T || !A || (!istype(T, /turf/open/floor/clockwork) && (!A.powered(EQUIP) || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha)))
return !T || !A || (!istype(T, /turf/open/floor/clockwork) && (!A.powered(EQUIP) || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/vehicle/sealed/mecha)))
/mob/living/silicon/ai/updatehealth()
if(status_flags & GODMODE)
@@ -1,11 +1,5 @@
/mob/living/silicon/ai/Login()
..()
if(stat != DEAD)
for(var/each in GLOB.ai_status_displays) //change status
var/obj/machinery/status_display/ai/O = each
O.mode = 1
O.emotion = emote_display
O.update()
set_eyeobj_visible(TRUE)
if(multicam_on)
end_multicam()
@@ -1,8 +1,4 @@
/mob/living/silicon/ai/Logout()
..()
for(var/each in GLOB.ai_status_displays) //change status
var/obj/machinery/status_display/ai/O = each
O.mode = 0
O.update()
set_eyeobj_visible(FALSE)
view_core()
@@ -6,7 +6,7 @@
var/highlighted = FALSE
var/mob/camera/aiEye/pic_in_pic/aiEye
/atom/movable/screen/movable/pic_in_pic/ai/Initialize()
/atom/movable/screen/movable/pic_in_pic/ai/Initialize(mapload)
. = ..()
aiEye = new /mob/camera/aiEye/pic_in_pic()
aiEye.screen = src
@@ -103,7 +103,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room)
icon = 'icons/mob/landmarks.dmi'
icon_state = "x"
/obj/effect/landmark/ai_multicam_room/Initialize()
/obj/effect/landmark/ai_multicam_room/Initialize(mapload)
. = ..()
qdel(GLOB.ai_camera_room_landmark)
GLOB.ai_camera_room_landmark = src
+7
View File
@@ -11,3 +11,10 @@
if(G)
mind.remove_antag_datum(G)
..()
/mob/living/silicon/auto_deadmin_on_login()
if(!client?.holder)
return TRUE
if(CONFIG_GET(flag/auto_deadmin_silicons) || (client.prefs?.deadmin & DEADMIN_POSITION_SILICON))
return client.holder.auto_deadmin()
return ..()
+2 -2
View File
@@ -95,7 +95,7 @@
GLOB.pai_list -= src
return ..()
/mob/living/silicon/pai/Initialize()
/mob/living/silicon/pai/Initialize(mapload)
var/obj/item/paicard/P = loc
START_PROCESSING(SSfastprocess, src)
GLOB.pai_list += src
@@ -143,7 +143,7 @@
custom_holoform.Grant(src)
emitter_next_use = world.time + 10 SECONDS
/mob/living/silicon/pai/deployed/Initialize()
/mob/living/silicon/pai/deployed/Initialize(mapload)
. = ..()
fold_out(TRUE)
@@ -731,7 +731,7 @@
/mob/living/silicon/robot/modules
var/set_module = /obj/item/robot_module
/mob/living/silicon/robot/modules/Initialize()
/mob/living/silicon/robot/modules/Initialize(mapload)
. = ..()
module.transform_to(set_module)
@@ -772,7 +772,7 @@
cell = /obj/item/stock_parts/cell/hyper
// radio = /obj/item/radio/borg/syndicate
/mob/living/silicon/robot/modules/syndicate/Initialize()
/mob/living/silicon/robot/modules/syndicate/Initialize(mapload)
. = ..()
radio = new /obj/item/radio/borg/syndicate(src)
laws = new /datum/ai_laws/syndicate_override()
@@ -43,7 +43,7 @@
var/moduleselect_alternate_icon
var/dogborg = FALSE
/obj/item/robot_module/Initialize()
/obj/item/robot_module/Initialize(mapload)
. = ..()
for(var/i in basic_modules)
var/obj/item/I = new i(src)
@@ -638,7 +638,7 @@
return FALSE
return ..()
/obj/item/robot_module/security/Initialize()
/obj/item/robot_module/security/Initialize(mapload)
. = ..()
if(!CONFIG_GET(flag/weaken_secborg))
for(var/obj/item/gun/energy/disabler/cyborg/pewpew in basic_modules)
+1 -1
View File
@@ -50,7 +50,7 @@
typing_indicator_state = /obj/effect/overlay/typing_indicator/machine
/mob/living/silicon/Initialize()
/mob/living/silicon/Initialize(mapload)
. = ..()
GLOB.silicon_mobs += src
faction += "silicon"
@@ -120,7 +120,7 @@
"<span class='boldwarning'>You are thrown off of [src]!</span>")
flash_act(affect_silicon = 1)
/mob/living/silicon/bullet_act(obj/item/projectile/P, def_zone)
/mob/living/silicon/bullet_act(obj/item/projectile/P, def_zone, piercing_hit = FALSE)
var/totaldamage = P.damage
if(P.original != src || P.firer != src) //try to block or reflect the bullet, can't do so when shooting oneself
var/list/returnlist = list()
@@ -141,7 +141,7 @@
"<span class='boldwarning'>You are knocked off of [src] by the [P]!</span>")
unbuckle_mob(M)
M.DefaultCombatKnockdown(40)
P.on_hit(src, 0, def_zone)
P.on_hit(src, 0, def_zone, 0, piercing_hit)
return BULLET_ACT_HIT
/mob/living/silicon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/tiled/flash/static)
@@ -110,7 +110,7 @@
return
return ..()
/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE, armorcheck = "melee")
/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE, armorcheck = MELEE)
var/temp_damage = damage
if(!damage_coeff[damagetype])
temp_damage = 0
@@ -124,10 +124,10 @@
apply_damage(damage, damagetype, null, getarmor(null, armorcheck))
return TRUE
/mob/living/simple_animal/bullet_act(obj/item/projectile/Proj)
/mob/living/simple_animal/bullet_act(obj/item/projectile/Proj, def_zone, piercing_hit = FALSE)
if(!Proj)
return
apply_damage(Proj.damage, Proj.damage_type)
apply_damage(Proj.damage, Proj.damage_type, 0, piercing_hit)
Proj.on_hit(src)
return BULLET_ACT_HIT
@@ -135,7 +135,7 @@
if(origin && istype(origin, /datum/spacevine_mutation) && isvineimmune(src))
return
..()
var/bomb_armor = getarmor(null, "bomb")
var/bomb_armor = getarmor(null, BOMB)
switch (severity)
if (EXPLODE_DEVASTATE)
if(prob(bomb_armor))
@@ -30,7 +30,7 @@
playsound(src,'sound/effects/beepskyspinsabre.ogg',100,TRUE,-1)
stun_attack(AM)
/mob/living/simple_animal/bot/secbot/grievous/Initialize()
/mob/living/simple_animal/bot/secbot/grievous/Initialize(mapload)
. = ..()
weapon = new baton_type(src)
INVOKE_ASYNC(weapon, /obj/item.proc/attack_self, src)
@@ -149,7 +149,7 @@
bot_reset() //Resets an AI's call, should it exist.
update_icon()
/mob/living/simple_animal/bot/Initialize()
/mob/living/simple_animal/bot/Initialize(mapload)
. = ..()
GLOB.bots_list += src
access_card = new /obj/item/card/id(src)
@@ -285,7 +285,7 @@
call_mode()
return
if(BOT_SUMMON) //Called by PDA
bot_summon()
summon_step()
return
return TRUE //Successful completion. Used to prevent child process() continuing if this one is ended early.
@@ -731,8 +731,6 @@ Pass a positive integer as an argument to override a bot's default speed.
mode = BOT_SUMMON
speak("Responding.", radio_channel)
calc_summon_path()
if("ejectpai")
ejectpairemote(user)
return
@@ -759,9 +757,6 @@ Pass a positive integer as an argument to override a bot's default speed.
else
to_chat(src, "<span class='warning'>Unidentified control sequence received:[command]</span>")
/mob/living/simple_animal/bot/proc/bot_summon() // summoned to PDA
summon_step()
// calculates a path to the current destination
// given an optional turf to avoid
/mob/living/simple_animal/bot/proc/calc_path(turf/avoid)
@@ -876,7 +871,7 @@ Pass a positive integer as an argument to override a bot's default speed.
anchored = FALSE
var/mob/living/simple_animal/bot/owner = null
/obj/machinery/bot_core/Initialize()
/obj/machinery/bot_core/Initialize(mapload)
. = ..()
owner = loc
if(!istype(owner))
@@ -102,7 +102,7 @@
if(ascended && user.stat == CONSCIOUS && user.client)
user.client.give_award(/datum/award/achievement/misc/cleanboss, user)
/mob/living/simple_animal/bot/cleanbot/Initialize()
/mob/living/simple_animal/bot/cleanbot/Initialize(mapload)
. = ..()
chosen_name = name
@@ -208,7 +208,7 @@
created_name = "Floorbot"
var/toolbox = /obj/item/storage/toolbox
/obj/item/bot_assembly/floorbot/Initialize()
/obj/item/bot_assembly/floorbot/Initialize(mapload)
. = ..()
update_icon()
@@ -277,7 +277,7 @@
var/healthanalyzer = /obj/item/healthanalyzer
var/firstaid = /obj/item/storage/firstaid
/obj/item/bot_assembly/medbot/Initialize()
/obj/item/bot_assembly/medbot/Initialize(mapload)
. = ..()
spawn(5)
if(skin)
@@ -39,7 +39,7 @@
var/extinguish_fires = TRUE
var/stationary_mode = FALSE
/mob/living/simple_animal/bot/firebot/Initialize()
/mob/living/simple_animal/bot/firebot/Initialize(mapload)
. = ..()
update_icon()
var/datum/job/engineer/J = new/datum/job/engineer
@@ -43,7 +43,7 @@
#define REPLACE_TILE 6
#define TILE_EMAG 7
/mob/living/simple_animal/bot/floorbot/Initialize()
/mob/living/simple_animal/bot/floorbot/Initialize(mapload)
. = ..()
update_icon()
var/datum/job/engineer/J = new/datum/job/engineer
@@ -37,7 +37,7 @@
var/weaponscheck = TRUE
var/bikehorn = /obj/item/bikehorn
/mob/living/simple_animal/bot/honkbot/Initialize()
/mob/living/simple_animal/bot/honkbot/Initialize(mapload)
. = ..()
update_icon()
auto_patrol = TRUE
@@ -49,7 +49,7 @@
var/obj/item/stock_parts/cell/cell
var/bloodiness = 0
/mob/living/simple_animal/bot/mulebot/Initialize()
/mob/living/simple_animal/bot/mulebot/Initialize(mapload)
. = ..()
wires = new /datum/wires/mulebot(src)
var/datum/job/cargo_tech/J = new/datum/job/cargo_tech
@@ -631,12 +631,12 @@
playsound(loc, 'sound/effects/splat.ogg', 50, TRUE)
var/damage = rand(5,15)
H.apply_damage(2*damage, BRUTE, BODY_ZONE_HEAD, run_armor_check(BODY_ZONE_HEAD, "melee"))
H.apply_damage(2*damage, BRUTE, BODY_ZONE_CHEST, run_armor_check(BODY_ZONE_CHEST, "melee"))
H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_LEG, run_armor_check(BODY_ZONE_L_LEG, "melee"))
H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_LEG, run_armor_check(BODY_ZONE_R_LEG, "melee"))
H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_ARM, run_armor_check(BODY_ZONE_L_ARM, "melee"))
H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_ARM, run_armor_check(BODY_ZONE_R_ARM, "melee"))
H.apply_damage(2*damage, BRUTE, BODY_ZONE_HEAD, run_armor_check(BODY_ZONE_HEAD, MELEE))
H.apply_damage(2*damage, BRUTE, BODY_ZONE_CHEST, run_armor_check(BODY_ZONE_CHEST, MELEE))
H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_LEG, run_armor_check(BODY_ZONE_L_LEG, MELEE))
H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_LEG, run_armor_check(BODY_ZONE_R_LEG, MELEE))
H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_ARM, run_armor_check(BODY_ZONE_L_ARM, MELEE))
H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_ARM, run_armor_check(BODY_ZONE_R_ARM, MELEE))
var/turf/T = get_turf(src)
T.add_mob_blood(H)
@@ -58,7 +58,7 @@
name = "Officer Pipsqueak"
desc = "It's Officer Beep O'sky's smaller, just-as aggressive cousin, Pipsqueak."
/mob/living/simple_animal/bot/secbot/beepsky/jr/Initialize()
/mob/living/simple_animal/bot/secbot/beepsky/jr/Initialize(mapload)
. = ..()
resize = 0.8
update_transform()
@@ -174,7 +174,7 @@
desc = "It's Officer Pingsky! Delegated to satellite guard duty for harbouring anti-human sentiment."
radio_channel = RADIO_CHANNEL_AI_PRIVATE
/mob/living/simple_animal/bot/secbot/Initialize()
/mob/living/simple_animal/bot/secbot/Initialize(mapload)
. = ..()
update_icon()
var/datum/job/detective/J = new/datum/job/detective
@@ -46,7 +46,7 @@
var/runetype
var/datum/mind/original_mind
/mob/living/simple_animal/hostile/construct/Initialize()
/mob/living/simple_animal/hostile/construct/Initialize(mapload)
. = ..()
update_health_hud()
var/spellnum = 1
@@ -382,7 +382,7 @@
return FALSE
. = ..()
/mob/living/simple_animal/hostile/construct/harvester/Initialize()
/mob/living/simple_animal/hostile/construct/harvester/Initialize(mapload)
. = ..()
var/datum/action/innate/seek_prey/seek = new()
seek.Grant(src)
@@ -34,7 +34,7 @@
///Innate spells that are supposed to be added when a beast is created
var/list/spells_to_add
/mob/living/simple_animal/hostile/eldritch/Initialize()
/mob/living/simple_animal/hostile/eldritch/Initialize(mapload)
. = ..()
add_spells()
@@ -63,7 +63,7 @@
var/list/linked_mobs = list()
/mob/living/simple_animal/hostile/eldritch/raw_prophet/Initialize()
/mob/living/simple_animal/hostile/eldritch/raw_prophet/Initialize(mapload)
. = ..()
link_mob(src)
@@ -31,7 +31,7 @@
speak_chance = 1
unique_name = FALSE
/mob/living/simple_animal/pet/bumbles/Initialize()
/mob/living/simple_animal/pet/bumbles/Initialize(mapload)
. = ..()
add_verb(src, /mob/living/proc/lay_down)
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
@@ -28,7 +28,7 @@
verb_exclaim = "flutters intensely"
verb_yell = "flutters intensely"
/mob/living/simple_animal/butterfly/Initialize()
/mob/living/simple_animal/butterfly/Initialize(mapload)
. = ..()
var/newcolor = rgb(rand(0, 255), rand(0, 255), rand(0, 255))
add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY)
@@ -36,7 +36,7 @@
var/held_icon = "cat2"
footstep_type = FOOTSTEP_MOB_CLAW
/mob/living/simple_animal/pet/cat/Initialize()
/mob/living/simple_animal/pet/cat/Initialize(mapload)
. = ..()
add_verb(src, /mob/living/proc/lay_down)
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
@@ -107,7 +107,7 @@
var/cats_deployed = 0
var/memory_saved = FALSE
/mob/living/simple_animal/pet/cat/Runtime/Initialize()
/mob/living/simple_animal/pet/cat/Runtime/Initialize(mapload)
if(prob(5))
icon_state = "original"
icon_living = "original"
@@ -31,7 +31,7 @@
var/squish_chance = 50
del_on_death = 1
/mob/living/simple_animal/cockroach/Initialize()
/mob/living/simple_animal/cockroach/Initialize(mapload)
. = ..()
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
@@ -26,7 +26,7 @@
var/obj/item/inventory_mask
gold_core_spawnable = FRIENDLY_SPAWN
/mob/living/simple_animal/crab/Initialize()
/mob/living/simple_animal/crab/Initialize(mapload)
. = ..()
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
@@ -84,7 +84,7 @@
animal_species = /mob/living/simple_animal/pet/dog/corgi/exoticcorgi
nofur = TRUE
/mob/living/simple_animal/pet/dog/Initialize()
/mob/living/simple_animal/pet/dog/Initialize(mapload)
. = ..()
var/dog_area = get_area(src)
for(var/obj/structure/bed/dogbed/D in dog_area)
@@ -92,11 +92,11 @@
D.update_owner(src)
break
/mob/living/simple_animal/pet/dog/corgi/Initialize()
/mob/living/simple_animal/pet/dog/corgi/Initialize(mapload)
. = ..()
regenerate_icons()
/mob/living/simple_animal/pet/dog/corgi/exoticcorgi/Initialize()
/mob/living/simple_animal/pet/dog/corgi/exoticcorgi/Initialize(mapload)
. = ..()
var/newcolor = rgb(rand(0, 255), rand(0, 255), rand(0, 255))
add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY)
@@ -400,7 +400,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
var/memory_saved = FALSE
var/saved_head //path
/mob/living/simple_animal/pet/dog/corgi/Ian/Initialize()
/mob/living/simple_animal/pet/dog/corgi/Ian/Initialize(mapload)
. = ..()
//parent call must happen first to ensure IAN
//is not in nullspace when child puppies spawn
@@ -79,7 +79,7 @@
"<span class='warning'>These rules are at admin discretion and will be heavily enforced.</span>\n"+\
"<span class='warning'><u>If you do not have the regular drone laws, follow your laws to the best of your ability.</u></span>"
/mob/living/simple_animal/drone/Initialize()
/mob/living/simple_animal/drone/Initialize(mapload)
. = ..()
GLOB.drones_list += src
access_card = new /obj/item/card/id(src)
@@ -140,6 +140,12 @@
if(!picked)
pickVisualAppearence()
/mob/living/simple_animal/drone/auto_deadmin_on_login()
if(!client?.holder)
return TRUE
if(CONFIG_GET(flag/auto_deadmin_silicons) || (client.prefs?.deadmin & DEADMIN_POSITION_SILICON))
return client.holder.auto_deadmin()
return ..()
/mob/living/simple_animal/drone/death(gibbed)
..(gibbed)
@@ -17,7 +17,7 @@
var/seasonal_hats = TRUE //If TRUE, and there are no default hats, different holidays will grant different hats
var/static/list/possible_seasonal_hats //This is built automatically in build_seasonal_hats() but can also be edited by admins!
/obj/item/drone_shell/Initialize()
/obj/item/drone_shell/Initialize(mapload)
. = ..()
var/area/A = get_area(src)
if(A)
@@ -31,7 +31,7 @@
hacked = TRUE
flavortext = null
/mob/living/simple_animal/drone/syndrone/Initialize()
/mob/living/simple_animal/drone/syndrone/Initialize(mapload)
. = ..()
var/datum/component/uplink/hidden_uplink = internal_storage.GetComponent(/datum/component/uplink)
hidden_uplink.telecrystals = 10
@@ -45,7 +45,7 @@
default_hatmask = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite
default_storage = /obj/item/uplink/nuclear
/mob/living/simple_animal/drone/syndrone/badass/Initialize()
/mob/living/simple_animal/drone/syndrone/badass/Initialize(mapload)
. = ..()
var/datum/component/uplink/hidden_uplink = internal_storage.GetComponent(/datum/component/uplink)
hidden_uplink.telecrystals = 30
@@ -55,7 +55,7 @@
/mob/living/simple_animal/drone/snowflake
default_hatmask = /obj/item/clothing/head/chameleon/drone
/mob/living/simple_animal/drone/snowflake/Initialize()
/mob/living/simple_animal/drone/snowflake/Initialize(mapload)
. = ..()
desc += " This drone appears to have a complex holoprojector built on its 'head'."
@@ -79,7 +79,7 @@
default_hatmask = null
picked = TRUE
/mob/living/simple_animal/drone/polymorphed/Initialize()
/mob/living/simple_animal/drone/polymorphed/Initialize(mapload)
. = ..()
liberate()
visualAppearence = pick(MAINTDRONE, REPAIRDRONE, SCOUTDRONE)
@@ -136,7 +136,7 @@
/mob/living/simple_animal/drone/cogscarab/admin //an admin-only subtype of cogscarab with a no-cost fabricator and slab in its box
default_storage = /obj/item/storage/toolbox/brass/prefilled/ratvar/admin
/mob/living/simple_animal/drone/cogscarab/Initialize()
/mob/living/simple_animal/drone/cogscarab/Initialize(mapload)
. = ..()
set_light(2, 0.5)
qdel(access_card) //we don't have free access
@@ -37,7 +37,7 @@
footstep_type = FOOTSTEP_MOB_SHOE
/mob/living/simple_animal/hostile/retaliate/goat/Initialize(/datum/reagent/milk_reagent)
/mob/living/simple_animal/hostile/retaliate/goat/Initialize(mapload, /datum/reagent/milk_reagent)
udder = new (null, milk_reagent)
. = ..()
@@ -144,7 +144,7 @@
footstep_type = FOOTSTEP_MOB_SHOE
/mob/living/simple_animal/cow/Initialize()
/mob/living/simple_animal/cow/Initialize(mapload)
udder = new(null, milk_reagent)
. = ..()
@@ -197,7 +197,7 @@
name = "strange cow"
desc = "Something seems off about the milk this cow is producing."
/mob/living/simple_animal/cow/random/Initialize()
/mob/living/simple_animal/cow/random/Initialize(mapload)
milk_reagent = get_random_reagent_id() //this has a blacklist so don't worry about romerol cows, etc
..()
@@ -210,7 +210,7 @@
speak_chance = 10 //the cow is eager to share its wisdom! //but is wise enough to not lag the server too bad
milk_reagent = /datum/reagent/medicine/liquid_wisdom
/mob/living/simple_animal/cow/wisdom/Initialize()
/mob/living/simple_animal/cow/wisdom/Initialize(mapload)
. = ..()
speak = GLOB.wisdoms //Done here so it's setup properly
@@ -248,7 +248,7 @@
footstep_type = FOOTSTEP_MOB_CLAW
/mob/living/simple_animal/chick/Initialize()
/mob/living/simple_animal/chick/Initialize(mapload)
. = ..()
pixel_x = rand(-6, 6)
pixel_y = rand(0, 10)
@@ -310,7 +310,7 @@
footstep_type = FOOTSTEP_MOB_CLAW
/mob/living/simple_animal/chicken/Initialize()
/mob/living/simple_animal/chicken/Initialize(mapload)
. = ..()
if(!body_color)
body_color = pick(validColors)
@@ -408,7 +408,7 @@
--kiwi_count
return ..()
/mob/living/simple_animal/kiwi/Initialize()
/mob/living/simple_animal/kiwi/Initialize(mapload)
. = ..()
++kiwi_count
@@ -482,7 +482,7 @@
footstep_type = FOOTSTEP_MOB_CLAW
/mob/living/simple_animal/babyKiwi/Initialize()
/mob/living/simple_animal/babyKiwi/Initialize(mapload)
. = ..()
pixel_x = rand(-6, 6)
pixel_y = rand(0, 10)
@@ -506,7 +506,7 @@
/obj/item/udder
name = "udder"
/obj/item/udder/Initialize(loc, milk_reagent)
/obj/item/udder/Initialize(mapload, loc, milk_reagent)
if(!milk_reagent)
milk_reagent = /datum/reagent/consumable/milk
create_reagents(50, NONE, NO_REAGENTS_VALUE)
@@ -31,7 +31,7 @@
//Gondolas don't make footstep sounds
/mob/living/simple_animal/pet/gondola/Initialize()
/mob/living/simple_animal/pet/gondola/Initialize(mapload)
. = ..()
if (!(istype(src, /mob/living/simple_animal/pet/gondola/gondolapod)))
CreateGondola()
@@ -30,7 +30,7 @@
var/chew_probability = 1
faction = list("rat")
/mob/living/simple_animal/mouse/Initialize()
/mob/living/simple_animal/mouse/Initialize(mapload)
. = ..()
AddComponent(/datum/component/squeak, list('sound/effects/mousesqueek.ogg'=1), 100)
if(!body_color)
@@ -174,7 +174,7 @@ GLOBAL_VAR(tom_existed)
desc = "Jerry the cat is not amused."
gold_core_spawnable = NO_SPAWN
/mob/living/simple_animal/mouse/brown/Tom/Initialize()
/mob/living/simple_animal/mouse/brown/Tom/Initialize(mapload)
. = ..()
GLOB.tom_existed = TRUE
@@ -38,7 +38,7 @@
else
..()
/mob/living/simple_animal/pet/Initialize()
/mob/living/simple_animal/pet/Initialize(mapload)
. = ..()
if(pcollar)
pcollar = new(src)
@@ -27,7 +27,7 @@
mob_biotypes = MOB_ORGANIC|MOB_BEAST
gold_core_spawnable = FRIENDLY_SPAWN
/mob/living/simple_animal/opossum/Initialize()
/mob/living/simple_animal/opossum/Initialize(mapload)
. = ..()
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
@@ -38,7 +38,7 @@
obj_damage = 0
environment_smash = ENVIRONMENT_SMASH_NONE
/mob/living/simple_animal/hostile/retaliate/poison/snake/Initialize()
/mob/living/simple_animal/hostile/retaliate/poison/snake/Initialize(mapload)
. = ..()
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
@@ -63,7 +63,7 @@ GLOBAL_LIST(bad_gremlin_items)
var/list/hear_memory = list()
var/const/max_hear_memory = 20
/mob/living/simple_animal/hostile/gremlin/Initialize()
/mob/living/simple_animal/hostile/gremlin/Initialize(mapload)
. = ..()
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
ADD_TRAIT(src, TRAIT_SHOCKIMMUNE, INNATE_TRAIT)
@@ -17,7 +17,7 @@
var/atom/movable/screen/alert/canstealthalert
var/atom/movable/screen/alert/instealthalert
/mob/living/simple_animal/hostile/guardian/assassin/Initialize()
/mob/living/simple_animal/hostile/guardian/assassin/Initialize(mapload)
. = ..()
stealthcooldown = 0
@@ -15,7 +15,7 @@
var/beacon_cooldown = 0
var/toggle = FALSE
/mob/living/simple_animal/hostile/guardian/healer/Initialize()
/mob/living/simple_animal/hostile/guardian/healer/Initialize(mapload)
. = ..()
var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
medsensor.add_hud_to(src)
@@ -40,7 +40,7 @@
death_sound = 'sound/voice/hiss6.ogg'
deathmessage = "lets out a waning guttural screech, green blood bubbling from its maw..."
/mob/living/simple_animal/hostile/alien/Initialize()
/mob/living/simple_animal/hostile/alien/Initialize(mapload)
. = ..()
AddComponent(/datum/component/footstep, FOOTSTEP_MOB_CLAW)
@@ -86,7 +86,7 @@
melee_damage_upper = 20
del_on_death = TRUE
loot = list(/obj/effect/mob_spawn/alien/corpse/humanoid/sentinel)
/mob/living/simple_animal/hostile/alien/queen
name = "alien queen"
@@ -30,7 +30,7 @@
var/projectile_density = TRUE //griffons get shot
del_on_death = TRUE
/mob/living/simple_animal/banana_spider/Initialize()
/mob/living/simple_animal/banana_spider/Initialize(mapload)
. = ..()
var/area/A = get_area(src)
if(A)
@@ -105,6 +105,6 @@
juice_results = list(/datum/reagent/consumable/banana = 0)
/obj/item/reagent_containers/food/snacks/deadbanana_spider/Initialize()
/obj/item/reagent_containers/food/snacks/deadbanana_spider/Initialize(mapload)
. = ..()
AddComponent(/datum/component/slippery, 20)
@@ -60,7 +60,7 @@
var/static/hydroponicstypecache = typecacheof(/obj/machinery/hydroponics)
var/held_icon = "" // bees are small and have no held icon (aka the coder doesn't know how to sprite it)
/mob/living/simple_animal/hostile/poison/bees/Initialize()
/mob/living/simple_animal/hostile/poison/bees/Initialize(mapload)
. = ..()
generate_bee_visuals()
AddComponent(/datum/component/swarming)
@@ -211,7 +211,7 @@
beehome = BB
break // End loop after the first compatible find.
/mob/living/simple_animal/hostile/poison/bees/toxin/Initialize()
/mob/living/simple_animal/hostile/poison/bees/toxin/Initialize(mapload)
. = ..()
var/datum/reagent/R = pick(typesof(/datum/reagent/toxin))
assign_reagent(GLOB.chemical_reagents_list[R])
@@ -289,7 +289,7 @@
..()
/obj/item/queen_bee/bought/Initialize()
/obj/item/queen_bee/bought/Initialize(mapload)
. = ..()
queen = new(src)
@@ -310,6 +310,6 @@
/mob/living/simple_animal/hostile/poison/bees/short
desc = "These bees seem unstable and won't survive for long."
/mob/living/simple_animal/hostile/poison/bees/short/Initialize()
/mob/living/simple_animal/hostile/poison/bees/short/Initialize(mapload)
. = ..()
addtimer(CALLBACK(src, .proc/death), 50 SECONDS)
@@ -13,7 +13,7 @@
var/point_regen_amount = 1
sentience_type = SENTIENCE_BOSS
/mob/living/simple_animal/hostile/boss/Initialize()
/mob/living/simple_animal/hostile/boss/Initialize(mapload)
. = ..()
atb = new()
@@ -182,7 +182,7 @@
duration = 18
randomdir = FALSE
/obj/effect/temp_visual/paperwiz_dying/Initialize()
/obj/effect/temp_visual/paperwiz_dying/Initialize(mapload)
. = ..()
visible_message("<span class='boldannounce'>The wizard cries out in pain as a gate appears behind him, sucking him in!</span>")
playsound(get_turf(src),'sound/magic/mandswap.ogg', 50, 1, 1)
@@ -32,7 +32,7 @@
verb_yell = "growls loudly"
del_on_death = TRUE
/mob/living/simple_animal/bread/hostile/Initialize()
/mob/living/simple_animal/bread/hostile/Initialize(mapload)
. = ..()
var/area/A = get_area(src)
if(A)
@@ -85,7 +85,7 @@
melee_damage_lower = 20
melee_damage_upper = 20
/mob/living/simple_animal/hostile/carp/megacarp/Initialize()
/mob/living/simple_animal/hostile/carp/megacarp/Initialize(mapload)
. = ..()
name = "[pick(GLOB.megacarp_first_names)] [pick(GLOB.megacarp_last_names)]"
melee_damage_lower += rand(4, 10)
@@ -109,7 +109,7 @@
/// Colored disk mouth appearance for adding it as a mouth overlay
var/mutable_appearance/colored_disk_mouth
/mob/living/simple_animal/hostile/carp/cayenne/Initialize()
/mob/living/simple_animal/hostile/carp/cayenne/Initialize(mapload)
. = ..()
// AddElement(/datum/element/pet_bonus, "bloops happily!")
// colored_disk_mouth = mutable_appearance(SSgreyscale.GetColoredIconByType(/datum/greyscale_config/carp/disk_mouth, greyscale_colors), "disk_mouth")
@@ -37,4 +37,4 @@
icon_state = "declone"
damage = 4
damage_type = BURN
flag = "energy"
flag = ENERGY
@@ -49,7 +49,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0)
hud_possible = list(ANTAG_HUD)
/mob/living/simple_animal/hostile/floor_cluwne/Initialize()
/mob/living/simple_animal/hostile/floor_cluwne/Initialize(mapload)
. = ..()
access_card = new /obj/item/card/id(src)
var/datum/job/captain/C = new /datum/job/captain
@@ -431,7 +431,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0)
duration = 600
randomdir = FALSE
/obj/effect/temp_visual/fcluwne_manifest/Initialize()
/obj/effect/temp_visual/fcluwne_manifest/Initialize(mapload)
. = ..()
playsound(src, 'sound/misc/floor_cluwne_emerge.ogg', 100, 1)
flick("fcluwne_manifest",src)
@@ -440,7 +440,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0)
name = "floor cluwne"
desc = "If you have this, tell a coder or admin!"
/obj/effect/dummy/floorcluwne_orbit/Initialize()
/obj/effect/dummy/floorcluwne_orbit/Initialize(mapload)
. = ..()
GLOB.floor_cluwnes++
name += " ([GLOB.floor_cluwnes])"
@@ -57,7 +57,7 @@
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()
/mob/living/simple_animal/hostile/poison/giant_spider/Initialize(mapload)
. = ..()
lay_web = new
lay_web.Grant(src)
@@ -122,7 +122,7 @@
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()
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/Initialize(mapload)
. = ..()
wrap = new
AddAbility(wrap)
@@ -208,7 +208,7 @@
var/datum/action/innate/spider/comm/letmetalkpls
gold_core_spawnable = NO_SPAWN
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife/Initialize()
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife/Initialize(mapload)
. = ..()
letmetalkpls = new
letmetalkpls.Grant(src)
@@ -396,7 +396,7 @@
action_icon_state = "wrap_0"
action_background_icon_state = "bg_alien"
/obj/effect/proc_holder/wrap/Initialize()
/obj/effect/proc_holder/wrap/Initialize(mapload)
. = ..()
action = new(src)
@@ -24,7 +24,7 @@
var/egg_lain = 0
gold_core_spawnable = NO_SPAWN //are you sure about this?? // CITADEL CHANGE, Yes.
/mob/living/simple_animal/hostile/headcrab/Initialize()
/mob/living/simple_animal/hostile/headcrab/Initialize(mapload)
. = ..()
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
@@ -33,7 +33,7 @@
footstep_type = FOOTSTEP_MOB_CLAW
/mob/living/simple_animal/hostile/hivebot/Initialize()
/mob/living/simple_animal/hostile/hivebot/Initialize(mapload)
. = ..()
deathmessage = "[src] blows apart!"
@@ -65,7 +65,7 @@
///Declares a cooldown for potential charges right off the bat.
COOLDOWN_DECLARE(charge_cooldown)
/mob/living/simple_animal/hostile/Initialize()
/mob/living/simple_animal/hostile/Initialize(mapload)
. = ..()
if(!targets_from)
@@ -146,7 +146,7 @@
if(!search_objects)
. = hearers(vision_range, targets_from) - src //Remove self, so we don't suicide
var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/structure/destructible/clockwork/ocular_warden,/obj/item/electronic_assembly))
var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/vehicle/sealed/mecha, /obj/structure/destructible/clockwork/ocular_warden,/obj/item/electronic_assembly))
for(var/HM in typecache_filter_list(range(vision_range, targets_from), hostile_machines))
if(can_see(targets_from, HM, vision_range))
@@ -236,9 +236,9 @@
return TRUE
if(ismecha(the_target))
var/obj/mecha/M = the_target
if(M.occupant)//Just so we don't attack empty mechs
if(CanAttack(M.occupant))
var/obj/vehicle/sealed/mecha/M = the_target
for(var/occupant in M.occupants)
if(CanAttack(occupant))
return TRUE
if(istype(the_target, /obj/machinery/porta_turret))
@@ -604,7 +604,7 @@
toggle_ai(AI_ON)
/mob/living/simple_animal/hostile/proc/ListTargetsLazy(var/_Z)//Step 1, find out what we can see
var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/structure/destructible/clockwork/ocular_warden))
var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/vehicle/sealed/mecha, /obj/structure/destructible/clockwork/ocular_warden))
. = list()
for (var/I in SSmobs.clients_by_zlevel[_Z])
var/mob/M = I
@@ -60,7 +60,7 @@
layer = ABOVE_ALL_MOB_LAYER
duration = 3
/obj/effect/temp_visual/leaper_projectile_impact/Initialize()
/obj/effect/temp_visual/leaper_projectile_impact/Initialize(mapload)
. = ..()
new /obj/effect/decal/cleanable/leaper_sludge(get_turf(src))
@@ -78,7 +78,7 @@
max_integrity = 10
density = FALSE
/obj/structure/leaper_bubble/Initialize()
/obj/structure/leaper_bubble/Initialize(mapload)
. = ..()
INVOKE_ASYNC(src, /atom/movable.proc/float, TRUE)
QDEL_IN(src, 100)
@@ -126,7 +126,7 @@
pixel_y = -32
duration = 30
/mob/living/simple_animal/hostile/jungle/leaper/Initialize()
/mob/living/simple_animal/hostile/jungle/leaper/Initialize(mapload)
. = ..()
remove_verb(src, /mob/living/verb/pulled)
@@ -33,12 +33,12 @@
footstep_type = FOOTSTEP_MOB_BAREFOOT
/mob/living/simple_animal/hostile/jungle/mook/CanPass(atom/movable/O)
/mob/living/simple_animal/hostile/jungle/mook/CanAllowThrough(atom/movable/O)
. = ..()
if(istype(O, /mob/living/simple_animal/hostile/jungle/mook))
var/mob/living/simple_animal/hostile/jungle/mook/M = O
if(M.attack_state == MOOK_ATTACK_ACTIVE && M.throwing)
return TRUE
return ..()
/mob/living/simple_animal/hostile/jungle/mook/death()
desc = "A deceased primitive. Upon closer inspection, it was suffering from severe cellular degeneration and its garments are machine made..."//Can you guess the twist
@@ -42,7 +42,7 @@
damage = 10
damage_type = BURN
light_range = 2
flag = "energy"
flag = ENERGY
light_color = LIGHT_COLOR_YELLOW
hitsound = 'sound/weapons/sear.ogg'
hitsound_wall = 'sound/weapons/effects/searwall.ogg'
@@ -29,6 +29,6 @@
maxbodytemp = 500
gold_core_spawnable = HOSTILE_SPAWN
/mob/living/simple_animal/hostile/killertomato/Initialize()
/mob/living/simple_animal/hostile/killertomato/Initialize(mapload)
. = ..()
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
@@ -25,14 +25,14 @@
search_objects = 0
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
var/spawn_mecha_type = /obj/mecha/combat/marauder/mauler/loaded
var/obj/mecha/mecha //Ref to pilot's mecha instance
var/spawn_mecha_type = /obj/vehicle/sealed/mecha/combat/marauder/mauler/loaded
var/obj/vehicle/sealed/mecha/mecha //Ref to pilot's mecha instance
var/required_mecha_charge = 7500 //If the pilot doesn't have a mecha, what charge does a potential Grand Theft Mecha need? (Defaults to half a battery)
var/mecha_charge_evacuate = 50 //Amount of charge at which the pilot tries to abandon the mecha
//Vars that control when the pilot uses their mecha's abilities (if the mecha has that ability)
var/threat_use_mecha_smoke = 5 //5 mobs is enough to engage crowd control
var/defence_mode_chance = 35 //Chance to engage Defence mode when damaged
var/defense_mode_chance = 35 //Chance to engage Defense mode when damaged
var/smoke_chance = 20 //Chance to deploy smoke for crowd control
var/retreat_chance = 40 //Chance to run away
@@ -40,35 +40,35 @@
spawn_mecha_type = null
search_objects = 2
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/Initialize()
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/Initialize(mapload)
. = ..()
wanted_objects = typecacheof(/obj/mecha/combat, TRUE)
wanted_objects = typecacheof(/obj/vehicle/sealed/mecha/combat, TRUE)
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/nanotrasen //nanotrasen are syndies! no it's just a weird path.
name = "Nanotrasen Mecha Pilot"
name = "\improper Nanotrasen Mecha Pilot"
desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour."
icon_living = "nanotrasen"
icon_state = "nanotrasen"
faction = list("nanotrasen")
spawn_mecha_type = /obj/mecha/combat/marauder/loaded
spawn_mecha_type = /obj/vehicle/sealed/mecha/combat/marauder/loaded
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/nanotrasen
name = "Nanotrasen Mecha Pilot"
name = "\improper Nanotrasen Mecha Pilot"
desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour."
icon_living = "nanotrasen"
icon_state = "nanotrasen"
faction = list("nanotrasen")
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Initialize()
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Initialize(mapload)
. = ..()
if(spawn_mecha_type)
var/obj/mecha/M = new spawn_mecha_type (get_turf(src))
var/obj/vehicle/sealed/mecha/M = new spawn_mecha_type (get_turf(src))
if(istype(M))
enter_mecha(M)
INVOKE_ASYNC(src, .proc/enter_mecha, M)
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/enter_mecha(obj/mecha/M)
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/enter_mecha(obj/vehicle/sealed/mecha/M)
if(!M)
return 0
target = null //Target was our mecha, so null it out
@@ -78,7 +78,7 @@
var/do_ranged = 0
for(var/equip in mecha.equipment)
var/obj/item/mecha_parts/mecha_equipment/ME = equip
if(ME.range & RANGED)
if(ME.range & MECHA_RANGED)
do_ranged = 1
break
if(do_ranged)
@@ -89,11 +89,11 @@
ranged = 0
wanted_objects = list()
search_objects = 0
if(mecha && mecha.lights_action) //an AI mecha is an EVIL EVIL thing, so let's not hide them in the dark
mecha.lights_action.Activate()
if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_defense_mode) && !mecha.defense_mode)
var/datum/action/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_defense_mode]
action.Trigger(TRUE)
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/exit_mecha(obj/mecha/M)
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/exit_mecha(obj/vehicle/sealed/mecha/M)
if(!M)
return 0
@@ -102,9 +102,9 @@
targets_from = src
//Find a new mecha
wanted_objects = typecacheof(/obj/mecha/combat, TRUE)
wanted_objects = typecacheof(/obj/vehicle/sealed/mecha/combat, TRUE)
var/search_aggressiveness = 2
for(var/obj/mecha/combat/C in range(vision_range,src))
for(var/obj/vehicle/sealed/mecha/combat/C in range(vision_range,src))
if(is_valid_mecha(C))
target = C
search_aggressiveness = 3 //We can see a mech? RUN FOR IT, IGNORE MOBS!
@@ -116,23 +116,23 @@
walk(M,0)//end any lingering movement loops, to prevent the haunted mecha bug
//Checks if a mecha is valid for theft
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/is_valid_mecha(obj/mecha/M)
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/is_valid_mecha(obj/vehicle/sealed/mecha/M)
if(!M)
return 0
if(M.occupant)
return 0
return FALSE
if(LAZYLEN(M.occupants))
return FALSE
if(!M.has_charge(required_mecha_charge))
return 0
return FALSE
if(M.obj_integrity < M.max_integrity*0.5)
return 0
return 1
return FALSE
return TRUE
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/mecha_face_target(atom/A)
if(mecha)
var/dirto = get_dir(mecha,A)
if(mecha.dir != dirto) //checking, because otherwise the mecha makes too many turn noises
mecha.mechturn(dirto)
mecha.vehicle_move(dirto, TRUE)
@@ -144,7 +144,7 @@
ME.rearm()
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/get_mecha_equip_by_flag(flag = RANGED)
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/get_mecha_equip_by_flag(flag = MECHA_RANGED)
. = list()
if(mecha)
for(var/equip in mecha.equipment)
@@ -160,11 +160,10 @@
if(mecha)
mecha_reload()
mecha_face_target(A)
var/list/possible_weapons = get_mecha_equip_by_flag(RANGED)
var/list/possible_weapons = get_mecha_equip_by_flag(MECHA_RANGED)
if(possible_weapons.len)
var/obj/item/mecha_parts/mecha_equipment/ME = pick(possible_weapons) //so we don't favor mecha.equipment[1] forever
if(ME.action(A))
ME.start_cooldown()
if(ME.action(src,A))
return
else
@@ -173,20 +172,19 @@
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/AttackingTarget()
if(mecha)
var/list/possible_weapons = get_mecha_equip_by_flag(MELEE)
var/list/possible_weapons = get_mecha_equip_by_flag(MECHA_MELEE)
if(possible_weapons.len)
var/obj/item/mecha_parts/mecha_equipment/ME = pick(possible_weapons)
mecha_face_target(target)
if(ME.action(target))
ME.start_cooldown()
if(ME.action(src,target))
return
if(mecha.melee_can_hit)
if(!TIMER_COOLDOWN_CHECK(mecha, COOLDOWN_MECHA_MELEE_ATTACK))
mecha_face_target(target)
target.mech_melee_attack(mecha)
target.mech_melee_attack(mecha, src)
else
if(ismecha(target))
var/obj/mecha/M = target
var/obj/vehicle/sealed/mecha/M = target
if(is_valid_mecha(M))
enter_mecha(M)
return
@@ -199,50 +197,54 @@
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/handle_automated_action()
if(..())
if(!mecha)
for(var/obj/mecha/combat/C in range(src,vision_range))
if(is_valid_mecha(C))
target = C //Let's nab it!
minimum_distance = 1
ranged = 0
break
if(mecha)
var/list/L = PossibleThreats()
var/threat_count = L.len
. = ..()
if(!.)
return
if(!mecha)
for(var/obj/vehicle/sealed/mecha/combat/mecha_in_range in range(src,vision_range))
if(is_valid_mecha(mecha_in_range))
target = mecha_in_range //Let's nab it!
minimum_distance = 1
ranged = 0
break
if(mecha)
var/list/L = PossibleThreats()
var/threat_count = L.len
//Low Charge - Eject
if(!mecha.has_charge(mecha_charge_evacuate))
exit_mecha(mecha)
return
//Low Charge - Eject
if(!mecha.has_charge(mecha_charge_evacuate))
exit_mecha(mecha)
return
//Too Much Damage - Eject
if(mecha.obj_integrity < mecha.max_integrity*0.1)
exit_mecha(mecha)
return
if(mecha.obj_integrity < mecha.max_integrity*0.1)
exit_mecha(mecha)
return
//Smoke if there's too many targets - Smoke Power
if(threat_count >= threat_use_mecha_smoke && prob(smoke_chance))
if(mecha.smoke_action && mecha.smoke_action.owner && mecha.smoke)
mecha.smoke_action.Activate()
//Smoke if there's too many targets - Smoke Power
if(threat_count >= threat_use_mecha_smoke && prob(smoke_chance))
if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_smoke) && !mecha.smoke_charges)
var/datum/action/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_smoke]
action.Trigger()
//Heavy damage - Defence Power or Retreat
if(mecha.obj_integrity < mecha.max_integrity*0.25)
if(prob(defence_mode_chance))
if(mecha.defense_action && mecha.defense_action.owner && !mecha.defence_mode)
mecha.leg_overload_mode = 0
mecha.defense_action.Activate(TRUE)
addtimer(CALLBACK(mecha.defense_action, /datum/action/innate/mecha/mech_defence_mode.proc/Activate, FALSE), 100) //10 seconds of defence, then toggle off
//Heavy damage - Defense Power or Retreat
if(mecha.obj_integrity < mecha.max_integrity*0.25)
if(prob(defense_mode_chance))
if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_defense_mode) && !mecha.defense_mode)
var/datum/action/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_defense_mode]
action.Trigger(TRUE)
addtimer(CALLBACK(action, /datum/action/vehicle/sealed/mecha/mech_defense_mode.proc/Trigger, FALSE), 100) //10 seconds of defense, then toggle off
else if(prob(retreat_chance))
//Speed boost if possible
if(mecha.overload_action && mecha.overload_action.owner && !mecha.leg_overload_mode)
mecha.overload_action.Activate(TRUE)
addtimer(CALLBACK(mecha.overload_action, /datum/action/innate/mecha/mech_defence_mode.proc/Activate, FALSE), 100) //10 seconds of speeeeed, then toggle off
else if(prob(retreat_chance))
//Speed boost if possible
if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_overload_mode) && !mecha.leg_overload_mode)
var/datum/action/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_overload_mode]
mecha.leg_overload_mode = FALSE
action.Trigger(TRUE)
addtimer(CALLBACK(action, /datum/action/vehicle/sealed/mecha/mech_overload_mode.proc/Trigger, FALSE), 100) //10 seconds of speeeeed, then toggle off
retreat_distance = 50
spawn(100)
retreat_distance = 0
retreat_distance = 50
addtimer(VARSET_CALLBACK(src, retreat_distance, 0), 10 SECONDS)
@@ -261,17 +263,17 @@
//~simple animals~
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/CanAttack(atom/the_target)
if(ismecha(the_target))
var/obj/mecha/M = the_target
var/obj/vehicle/sealed/mecha/M = the_target
if(mecha)
if(M == mecha || !CanAttack(M.occupant))
return 0
if(M == mecha) //Dont kill yourself
return FALSE
else //we're not in a mecha, so we check if we can steal it instead.
if(is_valid_mecha(M))
return 1
else if (M.occupant && CanAttack(M.occupant))
return 1
else
return 0
return TRUE
for(var/occupant in M.occupants)
if(CanAttack(occupant))
return TRUE
return FALSE
. = ..()
@@ -290,6 +292,6 @@
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Goto(target, delay, minimum_distance)
if(mecha)
walk_to(mecha, target, minimum_distance, mecha.step_in)
walk_to(mecha, target, minimum_distance, mecha.movedelay)
else
..()
@@ -57,7 +57,7 @@ Difficulty: Medium
/datum/action/innate/megafauna_attack/kinetic_accelerator,
/datum/action/innate/megafauna_attack/transform_weapon)
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Initialize()
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Initialize(mapload)
. = ..()
internal = new/obj/item/gps/internal/miner(src)
miner_saw = new(src)

Some files were not shown because too many files have changed in this diff Show More