mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-18 18:57:15 +01:00
Polaris sync
This commit is contained in:
@@ -159,11 +159,7 @@ Works together with spawning an observer, noted above.
|
||||
if(!loc) return
|
||||
if(!client) return 0
|
||||
|
||||
|
||||
if(client.images.len)
|
||||
for(var/image/hud in client.images)
|
||||
if(copytext(hud.icon_state,1,4) == "hud")
|
||||
client.images.Remove(hud)
|
||||
handle_regular_hud_updates()
|
||||
|
||||
if(antagHUD)
|
||||
var/list/target_list = list()
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
drop_l_hand()
|
||||
|
||||
if(healths)
|
||||
healths.overlays = null // This is specific to humans but the relevant code is here; shouldn't mess with other mobs.
|
||||
healths.icon_state = "health6"
|
||||
|
||||
timeofdeath = world.time
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
icon = 'icons/obj/aibots.dmi'
|
||||
icon_state = "ed2090"
|
||||
density = 1
|
||||
health = 100
|
||||
maxHealth = 100
|
||||
health = 200
|
||||
maxHealth = 200
|
||||
|
||||
is_ranged = 1
|
||||
preparing_arrest_sounds = new()
|
||||
@@ -76,7 +76,7 @@
|
||||
desc = "Some sort of bizarre assembly."
|
||||
icon = 'icons/obj/aibots.dmi'
|
||||
icon_state = "ed209_frame"
|
||||
item_state = "ed209_frame"
|
||||
item_state = "buildpipe"
|
||||
created_name = "ED-209 Security Robot"
|
||||
var/lasercolor = ""
|
||||
|
||||
@@ -101,10 +101,8 @@
|
||||
user << "<span class='notice'>You add the robot leg to [src].</span>"
|
||||
name = "legs/frame assembly"
|
||||
if(build_step == 1)
|
||||
item_state = "ed209_leg"
|
||||
icon_state = "ed209_leg"
|
||||
else
|
||||
item_state = "ed209_legs"
|
||||
icon_state = "ed209_legs"
|
||||
|
||||
if(2)
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
name = "Securitron"
|
||||
desc = "A little security robot. He looks less than thrilled."
|
||||
icon_state = "secbot0"
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
req_one_access = list(access_security, access_forensics_lockers)
|
||||
botcard_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels)
|
||||
patrol_speed = 2
|
||||
@@ -85,6 +85,18 @@
|
||||
declare_arrests = !declare_arrests
|
||||
attack_hand(usr)
|
||||
|
||||
/mob/living/bot/secbot/emag_act(var/remaining_uses, var/mob/user)
|
||||
. = ..()
|
||||
if(!emagged)
|
||||
if(user)
|
||||
user << "<span class='notice'>\The [src] buzzes and beeps.</span>"
|
||||
emagged = 1
|
||||
patrol_speed = 3
|
||||
target_speed = 4
|
||||
return 1
|
||||
else
|
||||
user << "<span class='notice'>\The [src] is already corrupt.</span>"
|
||||
|
||||
/mob/living/bot/secbot/attackby(var/obj/item/O, var/mob/user)
|
||||
var/curhealth = health
|
||||
..()
|
||||
@@ -130,7 +142,7 @@
|
||||
if(ishuman(target) && declare_arrests)
|
||||
var/area/location = get_area(src)
|
||||
broadcast_security_hud_message("[src] is [arrest_type ? "detaining" : "arresting"] a level [check_threat(target)] suspect <b>[target]</b> in <b>[location]</b>.", src)
|
||||
|
||||
|
||||
// say("Engaging patrol mode.")
|
||||
|
||||
/mob/living/bot/secbot/UnarmedAttack(var/mob/M, var/proximity)
|
||||
@@ -145,7 +157,7 @@
|
||||
var/cuff = 1
|
||||
if(istype(C, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = C
|
||||
if(istype(H.back, /obj/item/weapon/rig) && istype(H.gloves,/obj/item/clothing/gloves/rig))
|
||||
if(istype(H.back, /obj/item/weapon/rig) && istype(H.gloves,/obj/item/clothing/gloves/gauntlets/rig))
|
||||
cuff = 0
|
||||
if(!C.lying || C.handcuffed || arrest_type)
|
||||
cuff = 0
|
||||
@@ -238,6 +250,10 @@
|
||||
desc = "Some sort of bizarre assembly."
|
||||
icon = 'icons/obj/aibots.dmi'
|
||||
icon_state = "helmet_signaler"
|
||||
item_icons = list(
|
||||
slot_l_hand_str = 'icons/mob/items/lefthand_hats.dmi',
|
||||
slot_r_hand_str = 'icons/mob/items/righthand_hats.dmi',
|
||||
)
|
||||
item_state = "helmet"
|
||||
var/build_step = 0
|
||||
var/created_name = "Securitron"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/mob/living/carbon/alien/diona/confirm_evolution()
|
||||
|
||||
if(!is_alien_whitelisted(src, "Diona") && config.usealienwhitelist)
|
||||
if(!is_alien_whitelisted(src, all_species["Diona"]))
|
||||
src << alert("You are currently not whitelisted to play as a full diona.")
|
||||
return null
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
/mob/living/carbon/proc/breathe()
|
||||
//if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return
|
||||
if(!should_have_organ(O_LUNGS) || does_not_breathe) return
|
||||
if(!should_have_organ(O_LUNGS)) return
|
||||
|
||||
var/datum/gas_mixture/breath = null
|
||||
|
||||
|
||||
@@ -613,7 +613,7 @@ wink, yawn, swish, sway/wag, fastsway/qwag, stopsway/swag"}
|
||||
set desc = "Sets a description which will be shown when someone examines you."
|
||||
set category = "IC"
|
||||
|
||||
pose = sanitize(input(usr, "This is [src]. [get_visible_gender() == MALE ? "He" : get_visible_gender() == FEMALE ? "She" : "They"] [get_visible_gender() == NEUTER ? "are" : "is"]...", "Pose", null) as text)
|
||||
pose = sanitize(input(usr, "This is [src]. [get_visible_gender() == MALE ? "He" : get_visible_gender() == FEMALE ? "She" : "They"]...", "Pose", null) as text)
|
||||
|
||||
/mob/living/carbon/human/verb/set_flavor()
|
||||
set name = "Set Flavour Text"
|
||||
|
||||
@@ -419,7 +419,7 @@
|
||||
if (pose)
|
||||
if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 )
|
||||
pose = addtext(pose,".") //Makes sure all emotes end with a period.
|
||||
msg += "\n[T.He] [T.is] [pose]"
|
||||
msg += "\n[T.He] [pose]"
|
||||
|
||||
user << msg
|
||||
|
||||
|
||||
@@ -27,16 +27,16 @@
|
||||
if(mind)
|
||||
mind.name = real_name
|
||||
|
||||
hud_list[HEALTH_HUD] = image('icons/mob/hud.dmi', src, "hudhealth100")
|
||||
hud_list[STATUS_HUD] = image('icons/mob/hud.dmi', src, "hudhealthy")
|
||||
hud_list[LIFE_HUD] = image('icons/mob/hud.dmi', src, "hudhealthy")
|
||||
hud_list[ID_HUD] = image('icons/mob/hud.dmi', src, "hudunknown")
|
||||
hud_list[WANTED_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPLOYAL_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPCHEM_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[STATUS_HUD_OOC] = image('icons/mob/hud.dmi', src, "hudhealthy")
|
||||
hud_list[HEALTH_HUD] = new /image/hud_overlay('icons/mob/hud_med.dmi', src, "100")
|
||||
hud_list[STATUS_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy")
|
||||
hud_list[LIFE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy")
|
||||
hud_list[ID_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudunknown")
|
||||
hud_list[WANTED_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPLOYAL_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPCHEM_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPTRACK_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[SPECIALROLE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[STATUS_HUD_OOC] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy")
|
||||
|
||||
human_mob_list |= src
|
||||
..()
|
||||
@@ -341,6 +341,8 @@
|
||||
|
||||
var/obj/item/organ/external/affected_organ = get_organ(check_zone(def_zone))
|
||||
var/siemens_coeff = base_siemens_coeff * get_siemens_coefficient_organ(affected_organ)
|
||||
if(fire_stacks < 0) // Water makes you more conductive.
|
||||
siemens_coeff *= 1.5
|
||||
|
||||
return ..(shock_damage, source, siemens_coeff, def_zone)
|
||||
|
||||
@@ -1028,9 +1030,8 @@
|
||||
src << msg
|
||||
|
||||
organ.take_damage(rand(1,3), 0, 0)
|
||||
if(!(organ.robotic >= ORGAN_ROBOT) && !(should_have_organ(O_HEART))) //There is no blood in protheses.
|
||||
if(!(organ.robotic >= ORGAN_ROBOT) && (should_have_organ(O_HEART))) //There is no blood in protheses.
|
||||
organ.status |= ORGAN_BLEEDING
|
||||
src.adjustToxLoss(rand(1,3))
|
||||
|
||||
/mob/living/carbon/human/verb/check_pulse()
|
||||
set category = "Object"
|
||||
@@ -1331,13 +1332,11 @@
|
||||
var/obj/item/organ/external/current_limb = organs_by_name[limb]
|
||||
if(current_limb && current_limb.dislocated > 0 && !current_limb.is_parent_dislocated()) //if the parent is also dislocated you will have to relocate that first
|
||||
limbs |= current_limb
|
||||
var/choice = input(usr,"Which joint do you wish to relocate?") as null|anything in limbs
|
||||
var/obj/item/organ/external/current_limb = input(usr,"Which joint do you wish to relocate?") as null|anything in limbs
|
||||
|
||||
if(!choice)
|
||||
if(!current_limb)
|
||||
return
|
||||
|
||||
var/obj/item/organ/external/current_limb = organs_by_name[choice]
|
||||
|
||||
if(self)
|
||||
src << "<span class='warning'>You brace yourself to relocate your [current_limb.joint]...</span>"
|
||||
else
|
||||
@@ -1345,7 +1344,7 @@
|
||||
|
||||
if(!do_after(U, 30))
|
||||
return
|
||||
if(!choice || !current_limb || !S || !U)
|
||||
if(!current_limb || !S || !U)
|
||||
return
|
||||
|
||||
if(self)
|
||||
|
||||
@@ -18,12 +18,11 @@ emp_act
|
||||
|
||||
//Shields
|
||||
var/shield_check = check_shields(P.damage, P, null, def_zone, "the [P.name]")
|
||||
if(shield_check)
|
||||
if(shield_check < 0)
|
||||
return shield_check
|
||||
else
|
||||
P.on_hit(src, 2, def_zone)
|
||||
return 2
|
||||
if(shield_check) // If the block roll succeeded, this is true.
|
||||
if(shield_check < 0) // The shield did something weird and the bullet needs to keep doing things (e.g. it was reflected).
|
||||
return shield_check // Likely equal to PROJECTILE_FORCE_MISS or PROJECTILE_CONTINUE.
|
||||
else // Otherwise we blocked normally and stopped all the damage.
|
||||
return 0
|
||||
|
||||
//Shrapnel
|
||||
if(P.can_embed())
|
||||
@@ -40,6 +39,8 @@ emp_act
|
||||
/mob/living/carbon/human/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone)
|
||||
var/obj/item/organ/external/affected = get_organ(check_zone(def_zone))
|
||||
var/siemens_coeff = get_siemens_coefficient_organ(affected)
|
||||
if(fire_stacks < 0) // Water makes you more conductive.
|
||||
siemens_coeff *= 1.5
|
||||
stun_amount *= siemens_coeff
|
||||
agony_amount *= siemens_coeff
|
||||
|
||||
@@ -152,7 +153,16 @@ emp_act
|
||||
if(user == src) // Attacking yourself can't miss
|
||||
return target_zone
|
||||
|
||||
var/hit_zone = get_zone_with_miss_chance(target_zone, src)
|
||||
// Certain statuses make it harder to score a hit. These are the same as gun accuracy, however melee doesn't use multiples of 15.
|
||||
var/accuracy_penalty = 0
|
||||
if(user.eye_blind)
|
||||
accuracy_penalty += 75
|
||||
if(user.eye_blurry)
|
||||
accuracy_penalty += 30
|
||||
if(user.confused)
|
||||
accuracy_penalty += 45
|
||||
|
||||
var/hit_zone = get_zone_with_miss_chance(target_zone, src, accuracy_penalty)
|
||||
|
||||
if(!hit_zone)
|
||||
visible_message("<span class='danger'>\The [user] misses [src] with \the [I]!</span>")
|
||||
|
||||
@@ -10,8 +10,11 @@
|
||||
if(embedded_flag)
|
||||
handle_embedded_objects() //Moving with objects stuck in you can cause bad times.
|
||||
|
||||
if(force_max_speed)
|
||||
return -3 // Returning -1 will actually result in a slowdown for Teshari.
|
||||
|
||||
if(CE_SPEEDBOOST in chem_effects)
|
||||
return -1
|
||||
return -3
|
||||
|
||||
var/health_deficiency = (maxHealth - health)
|
||||
if(health_deficiency >= 40) tally += (health_deficiency / 25)
|
||||
@@ -32,6 +35,11 @@
|
||||
for(var/obj/item/I in list(r_hand, l_hand) )
|
||||
tally += max(I.slowdown, 0)
|
||||
|
||||
// Dragging heavy objects will also slow you down, similar to above.
|
||||
if(pulling && istype(pulling, /obj/item))
|
||||
var/obj/item/pulled = pulling
|
||||
tally += max(pulled.slowdown, 0)
|
||||
|
||||
if(istype(buckled, /obj/structure/bed/chair/wheelchair))
|
||||
for(var/organ_name in list(BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM))
|
||||
var/obj/item/organ/external/E = get_organ(organ_name)
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
#define HUMAN_MAX_OXYLOSS 1 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it.
|
||||
#define HUMAN_CRIT_MAX_OXYLOSS ( 2.0 / 6) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 50HP to get through, so (1/6)*last_tick_duration per second. Breaths however only happen every 4 ticks. last_tick_duration = ~2.0 on average
|
||||
|
||||
#define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point
|
||||
#define HEAT_DAMAGE_LEVEL_2 4 //Amount of damage applied when your body temperature passes the 400K point
|
||||
#define HEAT_DAMAGE_LEVEL_3 8 //Amount of damage applied when your body temperature passes the 1000K point
|
||||
#define HEAT_DAMAGE_LEVEL_1 5 //Amount of damage applied when your body temperature just passes the 360.15k safety point
|
||||
#define HEAT_DAMAGE_LEVEL_2 10 //Amount of damage applied when your body temperature passes the 400K point
|
||||
#define HEAT_DAMAGE_LEVEL_3 20 //Amount of damage applied when your body temperature passes the 1000K point
|
||||
|
||||
#define COLD_DAMAGE_LEVEL_1 0.5 //Amount of damage applied when your body temperature just passes the 260.15k safety point
|
||||
#define COLD_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when your body temperature passes the 200K point
|
||||
@@ -327,6 +327,11 @@
|
||||
if(status_flags & GODMODE)
|
||||
return
|
||||
|
||||
if(does_not_breathe)
|
||||
failed_last_breath = 0
|
||||
adjustOxyLoss(-5)
|
||||
return
|
||||
|
||||
if(!breath || (breath.total_moles == 0) || suiciding)
|
||||
failed_last_breath = 1
|
||||
if(suiciding)
|
||||
@@ -1021,9 +1026,7 @@
|
||||
if(!client)
|
||||
return 0
|
||||
|
||||
for(var/image/hud in client.images)
|
||||
if(copytext(hud.icon_state,1,4) == "hud") //ugly, but icon comparison is worse, I believe
|
||||
client.images.Remove(hud)
|
||||
..()
|
||||
|
||||
client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask, global_hud.nvg, global_hud.thermal, global_hud.meson, global_hud.science, global_hud.whitense)
|
||||
|
||||
@@ -1031,37 +1034,38 @@
|
||||
var/obj/machinery/camera/cam = client.eye
|
||||
client.screen |= cam.client_huds
|
||||
|
||||
if(stat == UNCONSCIOUS && health <= 0)
|
||||
//Critical damage passage overlay
|
||||
var/severity = 0
|
||||
switch(health)
|
||||
if(-20 to -10) severity = 1
|
||||
if(-30 to -20) severity = 2
|
||||
if(-40 to -30) severity = 3
|
||||
if(-50 to -40) severity = 4
|
||||
if(-60 to -50) severity = 5
|
||||
if(-70 to -60) severity = 6
|
||||
if(-80 to -70) severity = 7
|
||||
if(-90 to -80) severity = 8
|
||||
if(-95 to -90) severity = 9
|
||||
if(-INFINITY to -95) severity = 10
|
||||
overlay_fullscreen("crit", /obj/screen/fullscreen/crit, severity)
|
||||
else
|
||||
clear_fullscreen("crit")
|
||||
//Oxygen damage overlay
|
||||
if(oxyloss)
|
||||
if(stat != DEAD)
|
||||
if(stat == UNCONSCIOUS && health <= 0)
|
||||
//Critical damage passage overlay
|
||||
var/severity = 0
|
||||
switch(oxyloss)
|
||||
if(10 to 20) severity = 1
|
||||
if(20 to 25) severity = 2
|
||||
if(25 to 30) severity = 3
|
||||
if(30 to 35) severity = 4
|
||||
if(35 to 40) severity = 5
|
||||
if(40 to 45) severity = 6
|
||||
if(45 to INFINITY) severity = 7
|
||||
overlay_fullscreen("oxy", /obj/screen/fullscreen/oxy, severity)
|
||||
switch(health)
|
||||
if(-20 to -10) severity = 1
|
||||
if(-30 to -20) severity = 2
|
||||
if(-40 to -30) severity = 3
|
||||
if(-50 to -40) severity = 4
|
||||
if(-60 to -50) severity = 5
|
||||
if(-70 to -60) severity = 6
|
||||
if(-80 to -70) severity = 7
|
||||
if(-90 to -80) severity = 8
|
||||
if(-95 to -90) severity = 9
|
||||
if(-INFINITY to -95) severity = 10
|
||||
overlay_fullscreen("crit", /obj/screen/fullscreen/crit, severity)
|
||||
else
|
||||
clear_fullscreen("oxy")
|
||||
clear_fullscreen("crit")
|
||||
//Oxygen damage overlay
|
||||
if(oxyloss)
|
||||
var/severity = 0
|
||||
switch(oxyloss)
|
||||
if(10 to 20) severity = 1
|
||||
if(20 to 25) severity = 2
|
||||
if(25 to 30) severity = 3
|
||||
if(30 to 35) severity = 4
|
||||
if(35 to 40) severity = 5
|
||||
if(40 to 45) severity = 6
|
||||
if(45 to INFINITY) severity = 7
|
||||
overlay_fullscreen("oxy", /obj/screen/fullscreen/oxy, severity)
|
||||
else
|
||||
clear_fullscreen("oxy")
|
||||
|
||||
//Fire and Brute damage overlay (BSSR)
|
||||
var/hurtdamage = src.getBruteLoss() + src.getFireLoss() + damageoverlaytemp
|
||||
@@ -1137,19 +1141,37 @@
|
||||
if (analgesic > 100)
|
||||
healths.icon_state = "health_numb"
|
||||
else
|
||||
switch(hal_screwyhud)
|
||||
if(1) healths.icon_state = "health6"
|
||||
if(2) healths.icon_state = "health7"
|
||||
else
|
||||
//switch(health - halloss)
|
||||
switch(100 - (!can_feel_pain() ? 0 : traumatic_shock))
|
||||
if(100 to INFINITY) healths.icon_state = "health0"
|
||||
if(80 to 100) healths.icon_state = "health1"
|
||||
if(60 to 80) healths.icon_state = "health2"
|
||||
if(40 to 60) healths.icon_state = "health3"
|
||||
if(20 to 40) healths.icon_state = "health4"
|
||||
if(0 to 20) healths.icon_state = "health5"
|
||||
else healths.icon_state = "health6"
|
||||
// Generate a by-limb health display.
|
||||
healths.icon_state = "blank"
|
||||
healths.overlays = null
|
||||
|
||||
var/no_damage = 1
|
||||
var/trauma_val = 0 // Used in calculating softcrit/hardcrit indicators.
|
||||
if(!(species.flags & NO_PAIN))
|
||||
trauma_val = max(traumatic_shock,halloss)/species.total_health
|
||||
var/limb_trauma_val = trauma_val*0.3
|
||||
// Collect and apply the images all at once to avoid appearance churn.
|
||||
var/list/health_images = list()
|
||||
for(var/obj/item/organ/external/E in organs)
|
||||
if(no_damage && (E.brute_dam || E.burn_dam))
|
||||
no_damage = 0
|
||||
health_images += E.get_damage_hud_image(limb_trauma_val)
|
||||
|
||||
// Apply a fire overlay if we're burning.
|
||||
if(on_fire)
|
||||
health_images += image('icons/mob/screen1_health.dmi',"burning")
|
||||
|
||||
// Show a general pain/crit indicator if needed.
|
||||
if(trauma_val)
|
||||
if(!(species.flags & NO_PAIN))
|
||||
if(trauma_val > 0.7)
|
||||
health_images += image('icons/mob/screen1_health.dmi',"softcrit")
|
||||
if(trauma_val >= 1)
|
||||
health_images += image('icons/mob/screen1_health.dmi',"hardcrit")
|
||||
else if(no_damage)
|
||||
health_images += image('icons/mob/screen1_health.dmi',"fullhealth")
|
||||
|
||||
healths.overlays += health_images
|
||||
|
||||
if(nutrition_icon)
|
||||
switch(nutrition)
|
||||
@@ -1166,10 +1188,10 @@
|
||||
// if(resting || lying || sleeping) rest.icon_state = "rest1"
|
||||
// else rest.icon_state = "rest0"
|
||||
if(toxin)
|
||||
if(hal_screwyhud == 4 || phoron_alert) toxin.icon_state = "tox1"
|
||||
if(hal_screwyhud == 4 || (phoron_alert && !does_not_breathe)) toxin.icon_state = "tox1"
|
||||
else toxin.icon_state = "tox0"
|
||||
if(oxygen)
|
||||
if(hal_screwyhud == 3 || oxygen_alert) oxygen.icon_state = "oxy1"
|
||||
if(hal_screwyhud == 3 || (oxygen_alert && !does_not_breathe)) oxygen.icon_state = "oxy1"
|
||||
else oxygen.icon_state = "oxy0"
|
||||
if(fire)
|
||||
if(fire_alert) fire.icon_state = "fire[fire_alert]" //fire_alert is either 0 if no alert, 1 for cold and 2 for heat.
|
||||
@@ -1307,7 +1329,7 @@
|
||||
|
||||
// Puke if toxloss is too high
|
||||
if(!stat)
|
||||
if (getToxLoss() >= 45 && nutrition > 20)
|
||||
if (getToxLoss() >= 45)
|
||||
spawn vomit()
|
||||
|
||||
//0.1% chance of playing a scary sound to someone who's in complete darkness
|
||||
@@ -1495,10 +1517,9 @@
|
||||
if (BITTEST(hud_updateflag, HEALTH_HUD))
|
||||
var/image/holder = hud_list[HEALTH_HUD]
|
||||
if(stat == DEAD)
|
||||
holder.icon_state = "hudhealth-100" // X_X
|
||||
holder.icon_state = "-100" // X_X
|
||||
else
|
||||
var/percentage_health = RoundHealth((health-config.health_threshold_crit)/(maxHealth-config.health_threshold_crit)*100)
|
||||
holder.icon_state = "hud[percentage_health]"
|
||||
holder.icon_state = RoundHealth((health-config.health_threshold_crit)/(maxHealth-config.health_threshold_crit)*100)
|
||||
hud_list[HEALTH_HUD] = holder
|
||||
|
||||
if (BITTEST(hud_updateflag, LIFE_HUD))
|
||||
|
||||
@@ -108,6 +108,7 @@
|
||||
// HUD data vars.
|
||||
var/datum/hud_data/hud
|
||||
var/hud_type
|
||||
var/health_hud_intensity = 1 // This modifies how intensely the health hud is colored.
|
||||
|
||||
// Body/form vars.
|
||||
var/list/inherent_verbs // Species-specific verbs.
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
mob_size = MOB_SMALL
|
||||
has_fine_manipulation = 0
|
||||
show_ssd = null
|
||||
health_hud_intensity = 2
|
||||
|
||||
gibbed_anim = "gibbed-m"
|
||||
dusted_anim = "dust-m"
|
||||
|
||||
@@ -23,6 +23,7 @@ var/datum/species/shapeshifter/promethean/prometheans
|
||||
flags = NO_SCAN | NO_SLIP | NO_MINOR_CUT
|
||||
appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED //VOREStation Edit
|
||||
health_hud_intensity = 2
|
||||
|
||||
breath_type = null
|
||||
poison_type = null
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
name_language = "Schechi"
|
||||
min_age = 12
|
||||
max_age = 45
|
||||
health_hud_intensity = 3
|
||||
|
||||
blood_color = "#D514F7"
|
||||
flesh_color = "#5F7BB0"
|
||||
@@ -57,7 +58,7 @@
|
||||
)
|
||||
|
||||
has_limbs = list(
|
||||
BP_CHEST = list("path" = /obj/item/organ/external/chest),
|
||||
BP_TORSO = list("path" = /obj/item/organ/external/chest),
|
||||
BP_GROIN = list("path" = /obj/item/organ/external/groin),
|
||||
BP_HEAD = list("path" = /obj/item/organ/external/head/seromi),
|
||||
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
|
||||
@@ -84,7 +85,7 @@
|
||||
/datum/unarmed_attack/claws,
|
||||
/datum/unarmed_attack/stomp/weak
|
||||
)
|
||||
|
||||
/*
|
||||
var/shock_cap = 30
|
||||
var/hallucination_cap = 25
|
||||
|
||||
@@ -111,7 +112,7 @@
|
||||
H.shock_stage += 1
|
||||
if(H.shock_stage >= shock_cap && H.hallucination < hallucination_cap)
|
||||
H.hallucination += 2.5
|
||||
|
||||
*/
|
||||
/datum/species/teshari/get_vision_flags(var/mob/living/carbon/human/H)
|
||||
if(!(H.sdisabilities & DEAF) && !H.ear_deaf)
|
||||
return SEE_SELF|SEE_MOBS
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
name_language = null // Use the first-name last-name generator rather than a language scrambler
|
||||
min_age = 17
|
||||
max_age = 110
|
||||
health_hud_intensity = 1.5
|
||||
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR
|
||||
@@ -37,6 +38,7 @@
|
||||
num_alternate_languages = 2
|
||||
secondary_langs = list("Sinta'unathi")
|
||||
name_language = "Sinta'unathi"
|
||||
health_hud_intensity = 2.5
|
||||
|
||||
min_age = 18
|
||||
max_age = 60
|
||||
@@ -97,6 +99,7 @@
|
||||
num_alternate_languages = 2
|
||||
secondary_langs = list("Siik'tajr")
|
||||
name_language = "Siik'tajr"
|
||||
health_hud_intensity = 2.5
|
||||
|
||||
min_age = 17
|
||||
max_age = 80
|
||||
@@ -107,6 +110,11 @@
|
||||
of family and politics. They prefer colder environments, and speak a variety of languages, mostly Siik'Maas, \
|
||||
using unique inflections their mouths form."
|
||||
/* VOREStation Removal
|
||||
blurb = "The Tajaran are a mammalian species resembling roughly felines, hailing from Meralar in the Rarkajar system. \
|
||||
While reaching to the stars independently from outside influences, the humans engaged them in peaceful trade contact \
|
||||
and have accelerated the fledgling culture into the interstellar age. Their history is full of war and highly fractious \
|
||||
governments, something that permeates even to today's times. They prefer colder, tundra-like climates, much like their \
|
||||
home worlds and speak a variety of languages, especially Siik and Akhani."
|
||||
cold_level_1 = 200 //Default 260
|
||||
cold_level_2 = 140 //Default 200
|
||||
cold_level_3 = 80 //Default 120
|
||||
@@ -152,6 +160,7 @@
|
||||
num_alternate_languages = 2
|
||||
secondary_langs = list("Skrellian", "Schechi")
|
||||
name_language = "Skrellian"
|
||||
health_hud_intensity = 2
|
||||
|
||||
min_age = 19
|
||||
max_age = 80
|
||||
@@ -194,6 +203,7 @@
|
||||
show_ssd = "completely quiescent"
|
||||
num_alternate_languages = 1
|
||||
name_language = "Rootspeak"
|
||||
health_hud_intensity = 2.5
|
||||
|
||||
min_age = 1
|
||||
max_age = 300
|
||||
|
||||
@@ -18,9 +18,6 @@
|
||||
ExtinguishMob()
|
||||
return TRUE
|
||||
|
||||
if(..())
|
||||
return TRUE
|
||||
|
||||
if(handcuffed)
|
||||
spawn() escape_handcuffs()
|
||||
else if(legcuffed)
|
||||
@@ -50,7 +47,7 @@
|
||||
displaytime = breakouttime / 600 //Minutes
|
||||
|
||||
var/mob/living/carbon/human/H = src
|
||||
if(istype(H) && H.gloves && istype(H.gloves,/obj/item/clothing/gloves/rig))
|
||||
if(istype(H) && H.gloves && istype(H.gloves,/obj/item/clothing/gloves/gauntlets/rig))
|
||||
breakouttime /= 2
|
||||
displaytime /= 2
|
||||
|
||||
@@ -59,8 +56,8 @@
|
||||
"<span class='warning'>You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)</span>"
|
||||
)
|
||||
|
||||
if(do_after(src, breakouttime, incapacitation_flags = INCAPACITATION_DEFAULT & ~INCAPACITATION_RESTRAINED))
|
||||
if(!handcuffed || buckled)
|
||||
if(do_after(src, breakouttime, incapacitation_flags = INCAPACITATION_DISABLED & INCAPACITATION_KNOCKDOWN))
|
||||
if(!handcuffed)
|
||||
return
|
||||
visible_message(
|
||||
"<span class='danger'>\The [src] manages to remove \the [handcuffed]!</span>",
|
||||
|
||||
@@ -829,38 +829,35 @@ default behaviour is:
|
||||
return
|
||||
|
||||
if(!lastpuke)
|
||||
|
||||
lastpuke = 1
|
||||
if (nutrition <= 100)
|
||||
src << "<span class='danger'>You gag as you want to throw up, but there's nothing in your stomach!</span>"
|
||||
src.Weaken(10)
|
||||
src.adjustToxLoss(3)
|
||||
return
|
||||
|
||||
lastpuke = 1
|
||||
src << "<span class='warning'>You feel nauseous...</span>"
|
||||
|
||||
if(!skip_wait)
|
||||
sleep(150) //15 seconds until second warning
|
||||
src << "<span class='warning'>You feel like you are about to throw up!</span>"
|
||||
sleep(100) //and you have 10 more for mad dash to the bucket
|
||||
|
||||
Stun(5)
|
||||
src.visible_message("<span class='warning'>[src] throws up!</span>","<span class='warning'>You throw up!</span>")
|
||||
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
|
||||
|
||||
var/turf/simulated/T = get_turf(src)
|
||||
if(istype(T))
|
||||
if(blood_vomit)
|
||||
T.add_blood_floor(src)
|
||||
else
|
||||
T.add_vomit_floor(src, 1)
|
||||
|
||||
if(blood_vomit)
|
||||
if(getBruteLoss() < 50)
|
||||
adjustBruteLoss(3)
|
||||
else
|
||||
nutrition -= 40
|
||||
adjustToxLoss(-3)
|
||||
src << "<span class='warning'>You feel nauseous...</span>"
|
||||
|
||||
if(!skip_wait)
|
||||
sleep(150) //15 seconds until second warning
|
||||
src << "<span class='warning'>You feel like you are about to throw up!</span>"
|
||||
sleep(100) //and you have 10 more for mad dash to the bucket
|
||||
|
||||
Stun(5)
|
||||
src.visible_message("<span class='warning'>[src] throws up!</span>","<span class='warning'>You throw up!</span>")
|
||||
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
|
||||
|
||||
var/turf/simulated/T = get_turf(src)
|
||||
if(istype(T))
|
||||
if(blood_vomit)
|
||||
T.add_blood_floor(src)
|
||||
else
|
||||
T.add_vomit_floor(src, 1)
|
||||
|
||||
if(blood_vomit)
|
||||
if(getBruteLoss() < 50)
|
||||
adjustBruteLoss(3)
|
||||
else
|
||||
nutrition -= 40
|
||||
adjustToxLoss(-3)
|
||||
|
||||
sleep(350)
|
||||
lastpuke = 0
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
|
||||
//returns 0 if the effects failed to apply for some reason, 1 otherwise.
|
||||
/mob/living/proc/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone)
|
||||
if(!effective_force || blocked >= 100)
|
||||
if(!effective_force || blocked >= 100)
|
||||
return 0
|
||||
|
||||
//Hulk modifier
|
||||
@@ -300,6 +300,9 @@
|
||||
if(fire_stacks < 0)
|
||||
fire_stacks = min(0, ++fire_stacks) //If we've doused ourselves in water to avoid fire, dry off slowly
|
||||
|
||||
if(fire_stacks > 0)
|
||||
fire_stacks = max(0, (fire_stacks-0.1)) //Should slowly burn out
|
||||
|
||||
if(!on_fire)
|
||||
return 1
|
||||
else if(fire_stacks <= 0)
|
||||
|
||||
@@ -44,3 +44,6 @@
|
||||
|
||||
var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
|
||||
var/lastpuke = 0
|
||||
|
||||
var/evasion = 0 // Makes attacks harder to land. Each number equals 15% more likely to miss. Negative numbers increase hit chance.
|
||||
var/force_max_speed = 0 // If 1, the mob runs extremely fast and cannot be slowed.
|
||||
|
||||
@@ -173,15 +173,15 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
|
||||
spawn(5)
|
||||
new /obj/machinery/ai_powersupply(src)
|
||||
|
||||
hud_list[HEALTH_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[STATUS_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[LIFE_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[ID_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[WANTED_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPLOYAL_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPCHEM_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[HEALTH_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[STATUS_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[LIFE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[ID_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[WANTED_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPLOYAL_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPCHEM_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPTRACK_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[SPECIALROLE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
|
||||
ai_list += src
|
||||
..()
|
||||
@@ -565,7 +565,21 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
|
||||
var/icon_list[] = list(
|
||||
"default",
|
||||
"floating face",
|
||||
"carp"
|
||||
"carp",
|
||||
"ian",
|
||||
"runtime",
|
||||
"poly",
|
||||
"pun pun",
|
||||
"male human",
|
||||
"female human",
|
||||
"male unathi",
|
||||
"female unathi",
|
||||
"male tajara",
|
||||
"female tajara",
|
||||
"male tesharii",
|
||||
"female tesharii",
|
||||
"male skrell",
|
||||
"female skrell"
|
||||
)
|
||||
input = input("Please select a hologram:") as null|anything in icon_list
|
||||
if(input)
|
||||
@@ -577,6 +591,35 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo2"))
|
||||
if("carp")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo4"))
|
||||
if("ian")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"corgi"))
|
||||
if("runtime")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"cat"))
|
||||
if("poly")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"parrot_fly"))
|
||||
if("pun pun")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"punpun"))
|
||||
if("male human")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holohumm"))
|
||||
if("female human")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holohumf"))
|
||||
if("male unathi")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holounam"))
|
||||
if("female unathi")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holounaf"))
|
||||
if("male tajara")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holotajm"))
|
||||
if("female tajara")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holotajf"))
|
||||
if("male tesharii")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holotesm"))
|
||||
if("female tesharii")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holotesf"))
|
||||
if("male skrell")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holoskrm"))
|
||||
if("female skrell")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holoskrf"))
|
||||
|
||||
return
|
||||
|
||||
//Toggles the luminosity and applies it by re-entereing the camera.
|
||||
|
||||
@@ -29,15 +29,4 @@ var/global/list/empty_playable_ai_cores = list()
|
||||
global_announcer.autosay("[src] has been moved to intelligence storage.", "Artificial Intelligence Oversight")
|
||||
|
||||
//Handle job slot/tater cleanup.
|
||||
var/job = mind.assigned_role
|
||||
|
||||
job_master.FreeRole(job)
|
||||
|
||||
if(mind.objectives.len)
|
||||
qdel(mind.objectives)
|
||||
mind.special_role = null
|
||||
|
||||
clear_antag_roles(mind)
|
||||
|
||||
ghostize(0)
|
||||
qdel(src)
|
||||
clear_client()
|
||||
@@ -444,3 +444,18 @@
|
||||
else
|
||||
idaccessible = 0
|
||||
src << "<span class='notice'>You block access modfications.</span>"
|
||||
|
||||
/mob/living/silicon/pai/verb/wipe_software()
|
||||
set name = "Wipe Software"
|
||||
set category = "OOC"
|
||||
set desc = "Wipe your software. This is functionally equivalent to cryo or robotic storage, freeing up your job slot."
|
||||
|
||||
// Make sure people don't kill themselves accidentally
|
||||
if(alert("WARNING: This will immediately wipe your software and ghost you, removing your character from the round permanently (similar to cryo and robotic storage). Are you entirely sure you want to do this?",
|
||||
"Wipe Software", "No", "No", "Yes") != "Yes")
|
||||
return
|
||||
|
||||
close_up()
|
||||
visible_message("<b>[src]</b> fades away from the screen, the pAI device goes silent.")
|
||||
card.removePersonality()
|
||||
clear_client()
|
||||
|
||||
@@ -16,7 +16,18 @@
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 200)
|
||||
var/mode = 1;
|
||||
|
||||
|
||||
/obj/item/device/robotanalyzer/do_surgery(mob/living/M, mob/living/user)
|
||||
if(user.a_intent != I_HELP) //in case it is ever used as a surgery tool
|
||||
return ..()
|
||||
do_scan(M, user) //default surgery behaviour is just to scan as usual
|
||||
return 1
|
||||
|
||||
|
||||
/obj/item/device/robotanalyzer/attack(mob/living/M as mob, mob/living/user as mob)
|
||||
do_scan(M, user)
|
||||
|
||||
/obj/item/device/robotanalyzer/proc/do_scan(mob/living/M as mob, mob/living/user as mob)
|
||||
if((CLUMSY in user.mutations) && prob(50))
|
||||
user << text("\red You try to analyze the floor's vitals!")
|
||||
for(var/mob/O in viewers(M, null))
|
||||
|
||||
@@ -50,6 +50,15 @@
|
||||
/obj/item/weapon/newspaper
|
||||
)
|
||||
|
||||
/obj/item/weapon/gripper/chemistry
|
||||
name = "chemistry gripper"
|
||||
desc = "A simple grasping tool for chemical work."
|
||||
|
||||
can_hold = list(
|
||||
/obj/item/weapon/reagent_containers/glass,
|
||||
/obj/item/weapon/storage/pill_bottle
|
||||
)
|
||||
|
||||
/obj/item/weapon/gripper/research //A general usage gripper, used for toxins/robotics/xenobio/etc
|
||||
name = "scientific gripper"
|
||||
icon_state = "gripper-sci"
|
||||
@@ -92,6 +101,22 @@
|
||||
/obj/item/organ
|
||||
)
|
||||
|
||||
/obj/item/weapon/gripper/no_use/organ/Entered(var/atom/movable/AM)
|
||||
if(istype(AM, /obj/item/organ))
|
||||
var/obj/item/organ/O = AM
|
||||
O.preserved = 1
|
||||
for(var/obj/item/organ/organ in O)
|
||||
organ.preserved = 1
|
||||
..()
|
||||
|
||||
/obj/item/weapon/gripper/no_use/organ/Exited(var/atom/movable/AM)
|
||||
if(istype(AM, /obj/item/organ))
|
||||
var/obj/item/organ/O = AM
|
||||
O.preserved = 0
|
||||
for(var/obj/item/organ/organ in O)
|
||||
organ.preserved = 0
|
||||
..()
|
||||
|
||||
/obj/item/weapon/gripper/no_use/organ/robotics
|
||||
name = "external organ gripper"
|
||||
icon_state = "gripper-flesh"
|
||||
|
||||
@@ -147,15 +147,15 @@
|
||||
|
||||
add_robot_verbs()
|
||||
|
||||
hud_list[HEALTH_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[STATUS_HUD] = image('icons/mob/hud.dmi', src, "hudhealth100")
|
||||
hud_list[LIFE_HUD] = image('icons/mob/hud.dmi', src, "hudhealth100")
|
||||
hud_list[ID_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[WANTED_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPLOYAL_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPCHEM_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[HEALTH_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[STATUS_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealth100")
|
||||
hud_list[LIFE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealth100")
|
||||
hud_list[ID_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[WANTED_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPLOYAL_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPCHEM_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[IMPTRACK_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
hud_list[SPECIALROLE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
|
||||
|
||||
/mob/living/silicon/robot/proc/init()
|
||||
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
|
||||
|
||||
@@ -267,6 +267,10 @@
|
||||
name = "paper dispenser"
|
||||
icon = 'icons/obj/bureaucracy.dmi'
|
||||
icon_state = "paper_bin1"
|
||||
item_icons = list(
|
||||
slot_l_hand_str = 'icons/mob/items/lefthand_material.dmi',
|
||||
slot_r_hand_str = 'icons/mob/items/righthand_material.dmi',
|
||||
)
|
||||
item_state = "sheet-metal"
|
||||
|
||||
/obj/item/weapon/form_printer/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
|
||||
@@ -247,6 +247,7 @@ var/global/list/robot_modules = list(
|
||||
src.modules += new /obj/item/weapon/reagent_containers/dropper/industrial(src)
|
||||
src.modules += new /obj/item/weapon/reagent_containers/syringe(src)
|
||||
src.modules += new /obj/item/weapon/gripper/no_use/organ(src)
|
||||
src.modules += new /obj/item/weapon/gripper/chemistry(src)
|
||||
src.modules += new /obj/item/weapon/extinguisher/mini(src)
|
||||
src.emag = new /obj/item/weapon/reagent_containers/spray(src)
|
||||
src.emag.reagents.add_reagent("pacid", 250)
|
||||
|
||||
@@ -364,4 +364,19 @@
|
||||
|
||||
/mob/living/silicon/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash)
|
||||
if(affect_silicon)
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
/mob/living/silicon/proc/clear_client()
|
||||
//Handle job slot/tater cleanup.
|
||||
var/job = mind.assigned_role
|
||||
|
||||
job_master.FreeRole(job)
|
||||
|
||||
if(mind.objectives.len)
|
||||
qdel(mind.objectives)
|
||||
mind.special_role = null
|
||||
|
||||
clear_antag_roles(mind)
|
||||
|
||||
ghostize(0)
|
||||
qdel(src)
|
||||
|
||||
@@ -126,6 +126,7 @@
|
||||
|
||||
// redirect the projectile
|
||||
P.redirect(new_x, new_y, curloc, src)
|
||||
P.reflected = 1
|
||||
|
||||
return -1 // complete projectile permutation
|
||||
|
||||
|
||||
@@ -131,7 +131,7 @@
|
||||
|
||||
/mob/living/simple_animal/cat/fluff/handle_movement_target()
|
||||
if (friend)
|
||||
var/follow_dist = 5
|
||||
var/follow_dist = 4
|
||||
if (friend.stat >= DEAD || friend.health <= config.health_threshold_softcrit) //danger
|
||||
follow_dist = 1
|
||||
else if (friend.stat || friend.health <= 50) //danger or just sleeping
|
||||
@@ -181,24 +181,28 @@
|
||||
var/verb = pick("meows", "mews", "mrowls")
|
||||
audible_emote("[verb] anxiously.")
|
||||
|
||||
/mob/living/simple_animal/cat/fluff/verb/friend()
|
||||
/mob/living/simple_animal/cat/fluff/verb/become_friends()
|
||||
set name = "Become Friends"
|
||||
set category = "IC"
|
||||
set src in view(1)
|
||||
|
||||
if(friend && usr == friend)
|
||||
if(!friend)
|
||||
var/mob/living/carbon/human/H = usr
|
||||
if(istype(H) && (!befriend_job || H.job == befriend_job))
|
||||
friend = usr
|
||||
. = 1
|
||||
else if(usr == friend)
|
||||
. = 1 //already friends, but show success anyways
|
||||
|
||||
if(.)
|
||||
set_dir(get_dir(src, friend))
|
||||
say("Meow!")
|
||||
return
|
||||
|
||||
if (!(ishuman(usr) && befriend_job && usr.job == befriend_job))
|
||||
visible_emote(pick("nuzzles [friend].",
|
||||
"brushes against [friend].",
|
||||
"rubs against [friend].",
|
||||
"purrs."))
|
||||
else
|
||||
usr << "<span class='notice'>[src] ignores you.</span>"
|
||||
return
|
||||
|
||||
friend = usr
|
||||
|
||||
set_dir(get_dir(src, friend))
|
||||
say("Meow!")
|
||||
return
|
||||
|
||||
//RUNTIME IS ALIVE! SQUEEEEEEEE~
|
||||
/mob/living/simple_animal/cat/fluff/Runtime
|
||||
@@ -209,7 +213,6 @@
|
||||
item_state = "cat"
|
||||
icon_living = "cat"
|
||||
icon_dead = "cat_dead"
|
||||
befriend_job = "Chief Medical Officer"
|
||||
|
||||
/mob/living/simple_animal/cat/kitten
|
||||
name = "kitten"
|
||||
|
||||
@@ -195,3 +195,23 @@
|
||||
for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2))
|
||||
set_dir(i)
|
||||
sleep(1)
|
||||
|
||||
//Technically this should be like, its own file or something or a subset of dog but whatever. Not a coder.
|
||||
/mob/living/simple_animal/corgi/tamaskan
|
||||
name = "\improper tamaskan"
|
||||
real_name = "tamaskan"
|
||||
desc = "It's a tamaskan."
|
||||
icon_state = "tamaskan"
|
||||
icon_living = "tamaskan"
|
||||
icon_dead = "tamaskan_dead"
|
||||
|
||||
/mob/living/simple_animal/corgi/tamaskan/spice
|
||||
name = "Spice"
|
||||
real_name = "Spice" //Intended to hold the name without altering it.
|
||||
gender = FEMALE
|
||||
desc = "It's a tamaskan, the name Spice can be found on its collar."
|
||||
var/turns_since_scan = 0
|
||||
var/obj/movement_target
|
||||
response_help = "pets"
|
||||
response_disarm = "bops"
|
||||
response_harm = "kicks"
|
||||
@@ -155,7 +155,7 @@
|
||||
eject_brain()
|
||||
death()
|
||||
|
||||
/mob/living/simple_animal/spiderbot/proc/update_icon()
|
||||
/mob/living/simple_animal/spiderbot/update_icon()
|
||||
if(mmi)
|
||||
if(positronic)
|
||||
icon_state = "spiderbot-chassis-posi"
|
||||
|
||||
@@ -81,6 +81,7 @@
|
||||
var/destroy_surroundings = 0
|
||||
var/shuttletarget = null
|
||||
var/enroute = 0
|
||||
var/ai_inactive = 0 // Set to 1 to turn off most AI actions in Life()
|
||||
|
||||
var/list/resistances = list(
|
||||
HALLOSS = 0,
|
||||
@@ -136,7 +137,7 @@
|
||||
handle_supernatural()
|
||||
|
||||
//Movement
|
||||
if(!client && !stop_automated_movement && wander && !anchored)
|
||||
if(!client && !stop_automated_movement && wander && !anchored && !ai_inactive)
|
||||
if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc.
|
||||
turns_since_move++
|
||||
if(turns_since_move >= turns_per_move)
|
||||
@@ -236,7 +237,7 @@
|
||||
adjustBruteLoss(unsuitable_atoms_damage)
|
||||
|
||||
//Hostility
|
||||
if(!stat && !client && hostile)
|
||||
if(!stat && !client && hostile && !ai_inactive)
|
||||
switch(stance)
|
||||
if(STANCE_IDLE)
|
||||
target_mob = FindTarget()
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
|
||||
return
|
||||
|
||||
proc/update_icon() //only for the sake of consistency with the other update icon procs
|
||||
update_icon() //only for the sake of consistency with the other update icon procs
|
||||
if(stat == CONSCIOUS || stat == UNCONSCIOUS)
|
||||
if(previous) //midsection
|
||||
icon_state = "spaceworm[get_dir(src,previous) | get_dir(src,next)]" //see 3 lines below
|
||||
|
||||
@@ -31,9 +31,12 @@
|
||||
var/obj/screen/gun/run/gun_run_icon = null
|
||||
var/obj/screen/gun/mode/gun_setting_icon = null
|
||||
var/obj/screen/ling/chems/ling_chem_display = null
|
||||
var/obj/screen/wizard/energy/wiz_energy_display = null
|
||||
var/obj/screen/wizard/instability/wiz_instability_display = null
|
||||
|
||||
//spells hud icons - this interacts with add_spell and remove_spell
|
||||
var/list/obj/screen/movable/spell_master/spell_masters = null
|
||||
var/obj/screen/movable/ability_master/ability_master = null
|
||||
|
||||
/*A bunch of this stuff really needs to go under their own defines instead of being globally attached to mob.
|
||||
A variable should only be globally attached to turfs/objects/whatever, when it is in fact needed as such.
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
stat("Game Mode:", "Secret")
|
||||
else
|
||||
if(ticker.hide_mode == 0)
|
||||
stat("Game Mode:", "[master_mode]") // Old setting for showing the game mode
|
||||
stat("Game Mode:", "[config.mode_names[master_mode]]") // Old setting for showing the game mode
|
||||
|
||||
if(ticker.current_state == GAME_STATE_PREGAME)
|
||||
stat("Time To Start:", "[ticker.pregame_timeleft][round_progressing ? "" : " (DELAYED)"]")
|
||||
@@ -172,15 +172,14 @@
|
||||
usr << "<span class='danger'>The station is currently exploding. Joining would go poorly.</span>"
|
||||
return
|
||||
|
||||
if(client.prefs.species != "Human")
|
||||
if(!is_alien_whitelisted(src, client.prefs.species) && config.usealienwhitelist)
|
||||
src << alert("You are currently not whitelisted to play [client.prefs.species].")
|
||||
return 0
|
||||
if(!is_alien_whitelisted(src, all_species[client.prefs.species]))
|
||||
src << alert("You are currently not whitelisted to play [client.prefs.species].")
|
||||
return 0
|
||||
|
||||
var/datum/species/S = all_species[client.prefs.species]
|
||||
if(!(S.spawn_flags & SPECIES_CAN_JOIN))
|
||||
src << alert("Your current species, [client.prefs.species], is not available for play on the station.")
|
||||
return 0
|
||||
var/datum/species/S = all_species[client.prefs.species]
|
||||
if(!(S.spawn_flags & SPECIES_CAN_JOIN))
|
||||
src << alert("Your current species, [client.prefs.species], is not available for play on the station.")
|
||||
return 0
|
||||
|
||||
AttemptLateSpawn(href_list["SelectedJob"],client.prefs.spawnpoint)
|
||||
return
|
||||
@@ -410,7 +409,7 @@
|
||||
|
||||
if(chosen_species && use_species_name)
|
||||
// Have to recheck admin due to no usr at roundstart. Latejoins are fine though.
|
||||
if(is_species_whitelisted(chosen_species) || has_admin_rights())
|
||||
if(is_alien_whitelisted(chosen_species))
|
||||
new_character = new(loc, use_species_name)
|
||||
|
||||
if(!new_character)
|
||||
@@ -418,13 +417,6 @@
|
||||
|
||||
new_character.lastarea = get_area(loc)
|
||||
|
||||
for(var/lang in client.prefs.alternate_languages)
|
||||
var/datum/language/chosen_language = all_languages[lang]
|
||||
if(chosen_language)
|
||||
if(!config.usealienwhitelist || !(chosen_language.flags & WHITELISTED) || is_alien_whitelisted(src, lang) || has_admin_rights() \
|
||||
|| (new_character.species && (chosen_language.name in new_character.species.secondary_langs)))
|
||||
new_character.add_language(lang)
|
||||
|
||||
if(ticker.random_players)
|
||||
new_character.gender = pick(MALE, FEMALE)
|
||||
client.prefs.real_name = random_name(new_character.gender)
|
||||
@@ -451,6 +443,11 @@
|
||||
new_character.dna.SetSEState(GLASSESBLOCK,1,0)
|
||||
new_character.disabilities |= NEARSIGHTED
|
||||
|
||||
for(var/lang in client.prefs.alternate_languages)
|
||||
var/datum/language/chosen_language = all_languages[lang]
|
||||
if(chosen_language)
|
||||
if(is_lang_whitelisted(src,chosen_language) || (new_character.species && (chosen_language.name in new_character.species.secondary_langs)))
|
||||
new_character.add_language(lang)
|
||||
// And uncomment this, too.
|
||||
//new_character.dna.UpdateSE()
|
||||
|
||||
@@ -484,10 +481,6 @@
|
||||
/mob/new_player/proc/has_admin_rights()
|
||||
return check_rights(R_ADMIN, 0, src)
|
||||
|
||||
/mob/new_player/proc/is_species_whitelisted(datum/species/S)
|
||||
if(!S) return 1
|
||||
return is_alien_whitelisted(src, S.name) || !config.usealienwhitelist || !(S.spawn_flags & SPECIES_IS_WHITELISTED)
|
||||
|
||||
/mob/new_player/get_species()
|
||||
var/datum/species/chosen_species
|
||||
if(client.prefs.species)
|
||||
@@ -496,7 +489,7 @@
|
||||
if(!chosen_species)
|
||||
return "Human"
|
||||
|
||||
if(is_species_whitelisted(chosen_species) || has_admin_rights())
|
||||
if(is_alien_whitelisted(chosen_species))
|
||||
return chosen_species.name
|
||||
|
||||
return "Human"
|
||||
|
||||
@@ -194,31 +194,31 @@
|
||||
b_skin = blue
|
||||
|
||||
/datum/preferences/proc/dress_preview_mob(var/mob/living/carbon/human/mannequin)
|
||||
copy_to(mannequin)
|
||||
if(!dress_mob)
|
||||
var/update_icon = FALSE
|
||||
copy_to(mannequin, TRUE)
|
||||
|
||||
var/datum/job/previewJob
|
||||
if(equip_preview_mob)
|
||||
// Determine what job is marked as 'High' priority, and dress them up as such.
|
||||
if(job_civilian_low & ASSISTANT)
|
||||
previewJob = job_master.GetJob("Assistant")
|
||||
else
|
||||
for(var/datum/job/job in job_master.occupations)
|
||||
var/job_flag
|
||||
switch(job.department_flag)
|
||||
if(CIVILIAN)
|
||||
job_flag = job_civilian_high
|
||||
if(MEDSCI)
|
||||
job_flag = job_medsci_high
|
||||
if(ENGSEC)
|
||||
job_flag = job_engsec_high
|
||||
if(job.flag == job_flag)
|
||||
previewJob = job
|
||||
break
|
||||
else
|
||||
return
|
||||
|
||||
// Determine what job is marked as 'High' priority, and dress them up as such.
|
||||
var/datum/job/previewJob
|
||||
if(job_civilian_low & ASSISTANT)
|
||||
previewJob = job_master.GetJob("Assistant")
|
||||
else
|
||||
for(var/datum/job/job in job_master.occupations)
|
||||
var/job_flag
|
||||
switch(job.department_flag)
|
||||
if(CIVILIAN)
|
||||
job_flag = job_civilian_high
|
||||
if(MEDSCI)
|
||||
job_flag = job_medsci_high
|
||||
if(ENGSEC)
|
||||
job_flag = job_engsec_high
|
||||
if(job.flag == job_flag)
|
||||
previewJob = job
|
||||
break
|
||||
|
||||
if(previewJob)
|
||||
mannequin.job = previewJob.title
|
||||
previewJob.equip_preview(mannequin, player_alt_titles[previewJob.title])
|
||||
if((equip_preview_mob & EQUIP_PREVIEW_LOADOUT) && !(previewJob && (equip_preview_mob & EQUIP_PREVIEW_JOB) && (previewJob.type == /datum/job/ai || previewJob.type == /datum/job/cyborg)))
|
||||
var/list/equipped_slots = list() //If more than one item takes the same slot only spawn the first
|
||||
for(var/thing in gear)
|
||||
var/datum/gear/G = gear_datums[thing]
|
||||
@@ -238,9 +238,17 @@
|
||||
continue
|
||||
|
||||
if(G.slot && !(G.slot in equipped_slots))
|
||||
equipped_slots += G.slot
|
||||
var/metadata = gear[G.display_name]
|
||||
mannequin.equip_to_slot_or_del(G.spawn_item(mannequin, metadata), G.slot)
|
||||
if(mannequin.equip_to_slot_or_del(G.spawn_item(mannequin, metadata), G.slot))
|
||||
equipped_slots += G.slot
|
||||
update_icon = TRUE
|
||||
|
||||
if((equip_preview_mob & EQUIP_PREVIEW_JOB) && previewJob)
|
||||
mannequin.job = previewJob.title
|
||||
previewJob.equip_preview(mannequin, player_alt_titles[previewJob.title])
|
||||
update_icon = TRUE
|
||||
|
||||
if(update_icon)
|
||||
mannequin.update_icons()
|
||||
|
||||
/datum/preferences/proc/update_preview_icon()
|
||||
|
||||
@@ -190,6 +190,9 @@
|
||||
name = "Tress Shoulder"
|
||||
icon_state = "hair_tressshoulder"
|
||||
|
||||
spikyponytail
|
||||
name = "Spiky Ponytail"
|
||||
icon_state = "hair_spikyponytail"
|
||||
wisp
|
||||
name = "Wisp"
|
||||
icon_state = "hair_wisp"
|
||||
@@ -387,10 +390,6 @@
|
||||
name = "Hime Cut"
|
||||
icon_state = "hair_himecut"
|
||||
|
||||
braid
|
||||
name = "Floorlength Braid"
|
||||
icon_state = "bald" //Trust me, it's better this way.
|
||||
|
||||
mbraid
|
||||
name = "Medium Braid"
|
||||
icon_state = "hair_shortbraid"
|
||||
@@ -721,6 +720,31 @@
|
||||
icon_state = "hair_messy"
|
||||
species_allowed = list("Tajara")
|
||||
|
||||
taj_ears_curls
|
||||
name = "Tajara Curly"
|
||||
icon_state = "hair_curly"
|
||||
species_allowed = list("Tajara")
|
||||
|
||||
taj_ears_wife
|
||||
name = "Tajara Housewife"
|
||||
icon_state = "hair_wife"
|
||||
species_allowed = list("Tajara")
|
||||
|
||||
taj_ears_victory
|
||||
name = "Tajara Victory Curls"
|
||||
icon_state = "hair_victory"
|
||||
species_allowed = list("Tajara")
|
||||
|
||||
taj_ears_bob
|
||||
name = "Tajara Bob"
|
||||
icon_state = "hair_tbob"
|
||||
species_allowed = list("Tajara")
|
||||
|
||||
taj_ears_fingercurl
|
||||
name = "Tajara Finger Curls"
|
||||
icon_state = "hair_fingerwave"
|
||||
species_allowed = list("Tajara")
|
||||
|
||||
/datum/sprite_accessory/facial_hair
|
||||
|
||||
taj_sideburns
|
||||
|
||||
Reference in New Issue
Block a user