Merge branch 'release' of https://github.com/VOREStation/VOREStation into uppstream-update

This commit is contained in:
izac112
2024-01-22 05:18:14 +01:00
111 changed files with 2563 additions and 2522 deletions
+18 -14
View File
@@ -12,6 +12,8 @@ var/datum/antagonist/highlander/highlanders
initial_spawn_req = 3
initial_spawn_target = 5
id_type = /obj/item/weapon/card/id/centcom/ERT
/datum/antagonist/highlander/New()
..()
highlanders = src
@@ -32,26 +34,28 @@ var/datum/antagonist/highlander/highlanders
if(!..())
return
for (var/obj/item/I in player)
if (istype(I, /obj/item/weapon/implant))
continue
qdel(I)
// drop original items! It used to be a loop that just Qdeled everything including your organs!
// Dropping because of non-oxy breathers... That would suck wouldn't it?
player.drop_from_inventory(player.get_equipped_item(slot_wear_id))
player.drop_from_inventory(player.get_equipped_item(slot_wear_suit))
player.drop_from_inventory(player.get_equipped_item(slot_w_uniform))
player.drop_from_inventory(player.get_equipped_item(slot_l_ear))
player.drop_from_inventory(player.get_equipped_item(slot_head))
player.drop_from_inventory(player.get_equipped_item(slot_l_hand))
player.drop_from_inventory(player.get_equipped_item(slot_shoes))
player.drop_from_inventory(player.get_equipped_item(slot_l_store))
// highlanders!
player.equip_to_slot_or_del(new /obj/item/clothing/under/kilt(player), slot_w_uniform)
player.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(player), slot_l_ear)
player.equip_to_slot_or_del(new /obj/item/clothing/head/beret(player), slot_head)
player.equip_to_slot_or_del(new /obj/item/weapon/material/sword(player), slot_l_hand)
player.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/combat(player), slot_shoes)
player.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(get_turf(player)), slot_l_store)
var/obj/item/weapon/card/id/W = new(player)
W.name = "[player.real_name]'s ID Card"
W.icon_state = "centcom"
W.access = get_all_station_access().Copy()
W.access |= get_all_centcom_access()
W.assignment = "Highlander"
W.registered_name = player.real_name
player.equip_to_slot_or_del(W, slot_wear_id)
var/obj/item/weapon/card/id/id = create_id("Highlander", player)
if(id)
id.access |= get_all_station_access()
id.icon_state = "centcom"
create_radio(DTH_FREQ, player)
/proc/only_one()
@@ -30,7 +30,6 @@
"BAT" = /mob/living/simple_mob/animal/space/bats,
"SPIDER" = /mob/living/simple_mob/animal/giant_spider,
"SPIDER HUNTER" = /mob/living/simple_mob/animal/giant_spider/hunter,
"SPIDER NURSE" = /mob/living/simple_mob/animal/giant_spider/nurse,
"CARP" = /mob/living/simple_mob/animal/space/carp,
"BEAR" = /mob/living/simple_mob/animal/space/bear
)
@@ -57,4 +56,4 @@
// Now we hurt their new pal, because being forcefully abducted by teleportation can't be healthy.
summoned.adjustBruteLoss(summoned.getMaxHealth() * 0.3) // Lose 30% of max health on arrival (but could be healed back up).
summoned.adjustBruteLoss(summoned.getMaxHealth() * 0.3) // Lose 30% of max health on arrival (but could be healed back up).
@@ -104,7 +104,6 @@ var/global/list/semirandom_mob_spawner_decisions = list()
list(/mob/living/simple_mob/animal/sif/siffet),
list(/mob/living/simple_mob/animal/sif/tymisian),
list(
/mob/living/simple_mob/animal/giant_spider/nurse = 10,
/mob/living/simple_mob/animal/giant_spider/electric = 5,
/mob/living/simple_mob/animal/giant_spider/frost = 5,
/mob/living/simple_mob/animal/giant_spider/hunter = 10,
@@ -448,7 +447,6 @@ var/global/list/semirandom_mob_spawner_decisions = list()
possible_mob_types = list(
list(
/mob/living/simple_mob/animal/giant_spider/nurse = 10,
/mob/living/simple_mob/animal/giant_spider/electric = 5,
/mob/living/simple_mob/animal/giant_spider/frost = 5,
/mob/living/simple_mob/animal/giant_spider/hunter = 10,
+1 -1
View File
@@ -154,7 +154,7 @@
var/amount_grown = 0
var/obj/machinery/atmospherics/unary/vent_pump/entry_vent
var/travelling_in_vent = 0
var/list/grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/nurse, /mob/living/simple_mob/animal/giant_spider/hunter)
var/list/grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/hunter)
var/faction = "spiders"
var/stunted = FALSE
@@ -309,3 +309,17 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob
icon_state = "[initial(icon_state)]_on"
else
icon_state = initial(icon_state)
/obj/item/device/sleevemate/emag_act(var/remaining_charges, var/mob/user)
to_chat(user,"<span class='danger'>You hack [src]!</span>")
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src.loc)
spark_system.start()
playsound(src, "sparks", 50, 1)
if(istype(src.loc,/mob/living))
var/mob/living/L = src.loc
L.unEquip(src)
src.forceMove(get_turf(src))
new /obj/item/device/bodysnatcher(src.loc)
qdel(src)
return 1
@@ -635,7 +635,6 @@
list(/mob/living/simple_mob/animal/sif/siffet),
list(/mob/living/simple_mob/animal/sif/tymisian),
list(
/mob/living/simple_mob/animal/giant_spider/nurse = 10,
/mob/living/simple_mob/animal/giant_spider/electric = 5,
/mob/living/simple_mob/animal/giant_spider/frost = 5,
/mob/living/simple_mob/animal/giant_spider/hunter = 10,
@@ -1,184 +1,184 @@
// SEE code/modules/materials/materials.dm FOR DETAILS ON INHERITED DATUM.
// This class of weapons takes force and appearance data from a material datum.
// They are also fragile based on material data and many can break/smash apart.
/obj/item/weapon/material
health = 10
hitsound = 'sound/weapons/bladeslice.ogg'
gender = NEUTER
throw_speed = 3
throw_range = 7
w_class = ITEMSIZE_NORMAL
sharp = FALSE
edge = FALSE
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_material.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_material.dmi',
)
var/applies_material_colour = 1
var/unbreakable = 0 //Doesn't lose health
var/fragile = 0 //Shatters when it dies
var/dulled = 0 //Has gone dull
var/can_dull = 1 //Can it go dull?
var/force_divisor = 0.5
var/thrown_force_divisor = 0.5
var/dulled_divisor = 0.5 //Just drops the damage by half
var/default_material = MAT_STEEL
var/datum/material/material
var/drops_debris = 1
var/named_from_material = 1 //YW EDIT, Does it prepend the material's name to it's name?
/obj/item/weapon/material/New(var/newloc, var/material_key)
..(newloc)
if(!material_key)
material_key = default_material
set_material(material_key)
if(!material)
qdel(src)
return
matter = material.get_matter()
if(matter.len)
for(var/material_type in matter)
if(!isnull(matter[material_type]))
matter[material_type] *= force_divisor // May require a new var instead.
if(!(material.conductive))
src.flags |= NOCONDUCT
/obj/item/weapon/material/get_material()
return material
/obj/item/weapon/material/proc/update_force()
if(edge || sharp)
force = material.get_edge_damage()
else
force = material.get_blunt_damage()
force = round(force*force_divisor)
if(dulled)
force = round(force*dulled_divisor)
throwforce = round(material.get_blunt_damage()*thrown_force_divisor)
//spawn(1)
// to_world("[src] has force [force] and throwforce [throwforce] when made from default material [material.name]")
/obj/item/weapon/material/proc/set_material(var/new_material)
material = get_material_by_name(new_material)
if(!material)
qdel(src)
else
if(named_from_material) //YW EDIT
name = "[material.display_name] [initial(name)]"
health = round(material.integrity/10)
if(applies_material_colour)
color = material.icon_colour
if(material.products_need_process())
START_PROCESSING(SSobj, src)
update_force()
/obj/item/weapon/material/Destroy()
STOP_PROCESSING(SSobj, src)
. = ..()
/obj/item/weapon/material/apply_hit_effect()
..()
if(!unbreakable)
if(material.is_brittle())
health = 0
else if(!prob(material.hardness))
health--
check_health()
/obj/item/weapon/material/attackby(obj/item/weapon/W, mob/user)
if(istype(W, /obj/item/weapon/whetstone))
var/obj/item/weapon/whetstone/whet = W
repair(whet.repair_amount, whet.repair_time, user)
if(istype(W, /obj/item/weapon/material/sharpeningkit))
var/obj/item/weapon/material/sharpeningkit/SK = W
repair(SK.repair_amount, SK.repair_time, user)
..()
/obj/item/weapon/material/proc/check_health(var/consumed)
if(health<=0)
health = 0
if(fragile)
shatter(consumed)
else if(!dulled && can_dull)
dull()
/obj/item/weapon/material/proc/shatter(var/consumed)
var/turf/T = get_turf(src)
T.visible_message("<span class='danger'>\The [src] [material.destruction_desc]!</span>")
if(istype(loc, /mob/living))
var/mob/living/M = loc
M.drop_from_inventory(src)
playsound(src, "shatter", 70, 1)
if(!consumed && drops_debris) material.place_shard(T)
qdel(src)
/obj/item/weapon/material/proc/dull()
var/turf/T = get_turf(src)
T.visible_message("<span class='danger'>\The [src] goes dull!</span>")
playsound(src, "shatter", 70, 1)
dulled = 1
if(is_sharp() || has_edge())
sharp = FALSE
edge = FALSE
/obj/item/weapon/material/proc/repair(var/repair_amount, var/repair_time, mob/living/user)
if(!fragile)
if(health < initial(health))
user.visible_message("[user] begins repairing \the [src].", "You begin repairing \the [src].")
if(do_after(user, repair_time))
user.visible_message("[user] has finished repairing \the [src]", "You finish repairing \the [src].")
health = min(health + repair_amount, initial(health))
dulled = 0
sharp = initial(sharp)
edge = initial(edge)
else
to_chat(user, "<span class='notice'>[src] doesn't need repairs.</span>")
else
to_chat(user, "<span class='warning'>You can't repair \the [src].</span>")
return
/obj/item/weapon/material/proc/sharpen(var/material, var/sharpen_time, var/kit, mob/living/M)
if(!fragile)
if(health < initial(health))
to_chat(M, "You should repair [src] first. Try using [kit] on it.")
return FALSE
M.visible_message("[M] begins to replace parts of [src] with [kit].", "You begin to replace parts of [src] with [kit].")
if(do_after(usr, sharpen_time))
M.visible_message("[M] has finished replacing parts of [src].", "You finish replacing parts of [src].")
src.set_material(material)
return TRUE
else
to_chat(M, "<span class = 'warning'>You can't sharpen and re-edge [src].</span>")
return FALSE
/*
Commenting this out pending rebalancing of radiation based on small objects.
/obj/item/weapon/material/process()
if(!material.radioactivity)
return
for(var/mob/living/L in range(1,src))
L.apply_effect(round(material.radioactivity/30),IRRADIATE,0)
*/
/*
// Commenting this out while fires are so spectacularly lethal, as I can't seem to get this balanced appropriately.
/obj/item/weapon/material/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
TemperatureAct(exposed_temperature)
// This might need adjustment. Will work that out later.
/obj/item/weapon/material/proc/TemperatureAct(temperature)
health -= material.combustion_effect(get_turf(src), temperature, 0.1)
check_health(1)
/obj/item/weapon/material/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(material.ignition_point && WT.remove_fuel(0, user))
TemperatureAct(150)
else
return ..()
*/
// SEE code/modules/materials/materials.dm FOR DETAILS ON INHERITED DATUM.
// This class of weapons takes force and appearance data from a material datum.
// They are also fragile based on material data and many can break/smash apart.
/obj/item/weapon/material
health = 10
hitsound = 'sound/weapons/bladeslice.ogg'
gender = NEUTER
throw_speed = 3
throw_range = 7
w_class = ITEMSIZE_NORMAL
sharp = FALSE
edge = FALSE
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_material.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_material.dmi',
)
var/applies_material_colour = 1
var/unbreakable = 0 //Doesn't lose health
var/fragile = 0 //Shatters when it dies
var/dulled = 0 //Has gone dull
var/can_dull = 1 //Can it go dull?
var/force_divisor = 0.5
var/thrown_force_divisor = 0.5
var/dulled_divisor = 0.5 //Just drops the damage by half
var/default_material = MAT_STEEL
var/datum/material/material
var/drops_debris = 1
var/named_from_material = 1 //YW EDIT, Does it prepend the material's name to it's name?
/obj/item/weapon/material/New(var/newloc, var/material_key)
..(newloc)
if(!material_key)
material_key = default_material
set_material(material_key)
if(!material)
qdel(src)
return
matter = material.get_matter()
if(matter.len)
for(var/material_type in matter)
if(!isnull(matter[material_type]))
matter[material_type] *= force_divisor // May require a new var instead.
if(!(material.conductive))
src.flags |= NOCONDUCT
/obj/item/weapon/material/get_material()
return material
/obj/item/weapon/material/proc/update_force()
if(edge || sharp)
force = material.get_edge_damage()
else
force = material.get_blunt_damage()
force = round(force*force_divisor)
if(dulled)
force = round(force*dulled_divisor)
throwforce = round(material.get_blunt_damage()*thrown_force_divisor)
//spawn(1)
// to_world("[src] has force [force] and throwforce [throwforce] when made from default material [material.name]")
/obj/item/weapon/material/proc/set_material(var/new_material)
material = get_material_by_name(new_material)
if(!material)
qdel(src)
else
if(named_from_material) //YW EDIT
name = "[material.display_name] [initial(name)]"
health = round(material.integrity/10)
if(applies_material_colour)
color = material.icon_colour
if(material.products_need_process())
START_PROCESSING(SSobj, src)
update_force()
/obj/item/weapon/material/Destroy()
STOP_PROCESSING(SSobj, src)
. = ..()
/obj/item/weapon/material/apply_hit_effect()
..()
if(!unbreakable)
if(material.is_brittle())
health = 0
else if(!prob(material.hardness))
health--
check_health()
/obj/item/weapon/material/attackby(obj/item/weapon/W, mob/user)
if(istype(W, /obj/item/weapon/whetstone))
var/obj/item/weapon/whetstone/whet = W
repair(whet.repair_amount, whet.repair_time, user)
if(istype(W, /obj/item/weapon/material/sharpeningkit))
var/obj/item/weapon/material/sharpeningkit/SK = W
repair(SK.repair_amount, SK.repair_time, user)
..()
/obj/item/weapon/material/proc/check_health(var/consumed)
if(health<=0)
health = 0
if(fragile)
shatter(consumed)
else if(!dulled && can_dull)
dull()
/obj/item/weapon/material/proc/shatter(var/consumed)
var/turf/T = get_turf(src)
T.visible_message("<span class='danger'>\The [src] [material.destruction_desc]!</span>")
if(istype(loc, /mob/living))
var/mob/living/M = loc
M.drop_from_inventory(src)
playsound(src, "shatter", 70, 1)
if(!consumed && drops_debris) material.place_shard(T)
qdel(src)
/obj/item/weapon/material/proc/dull()
var/turf/T = get_turf(src)
T.visible_message("<span class='danger'>\The [src] goes dull!</span>")
playsound(src, "shatter", 70, 1)
dulled = 1
if(is_sharp() || has_edge())
sharp = FALSE
edge = FALSE
/obj/item/weapon/material/proc/repair(var/repair_amount, var/repair_time, mob/living/user)
if(!fragile)
if(health < initial(health))
user.visible_message("[user] begins repairing \the [src].", "You begin repairing \the [src].")
if(do_after(user, repair_time))
user.visible_message("[user] has finished repairing \the [src]", "You finish repairing \the [src].")
health = min(health + repair_amount, initial(health))
dulled = 0
sharp = initial(sharp)
edge = initial(edge)
else
to_chat(user, "<span class='notice'>[src] doesn't need repairs.</span>")
else
to_chat(user, "<span class='warning'>You can't repair \the [src].</span>")
return
/obj/item/weapon/material/proc/sharpen(var/material, var/sharpen_time, var/kit, mob/living/M)
if(!fragile && src.material.can_sharpen)
if(health < initial(health))
to_chat(M, "You should repair [src] first. Try using [kit] on it.")
return FALSE
M.visible_message("[M] begins to replace parts of [src] with [kit].", "You begin to replace parts of [src] with [kit].")
if(do_after(usr, sharpen_time))
M.visible_message("[M] has finished replacing parts of [src].", "You finish replacing parts of [src].")
src.set_material(material)
return TRUE
else
to_chat(M, "<span class = 'warning'>You can't sharpen and re-edge [src].</span>")
return FALSE
/*
Commenting this out pending rebalancing of radiation based on small objects.
/obj/item/weapon/material/process()
if(!material.radioactivity)
return
for(var/mob/living/L in range(1,src))
L.apply_effect(round(material.radioactivity/30),IRRADIATE,0)
*/
/*
// Commenting this out while fires are so spectacularly lethal, as I can't seem to get this balanced appropriately.
/obj/item/weapon/material/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
TemperatureAct(exposed_temperature)
// This might need adjustment. Will work that out later.
/obj/item/weapon/material/proc/TemperatureAct(temperature)
health -= material.combustion_effect(get_turf(src), temperature, 0.1)
check_health(1)
/obj/item/weapon/material/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(material.ignition_point && WT.remove_fuel(0, user))
TemperatureAct(150)
else
return ..()
*/
@@ -65,7 +65,8 @@
return ..()
/obj/item/weapon/storage/laundry_basket/dropped(mob/user as mob)
QDEL_NULL(linked)
if(linked)
QDEL_NULL(linked)
return ..()
/obj/item/weapon/storage/laundry_basket/show_to(mob/user as mob)
@@ -82,6 +83,6 @@
use_to_pickup = FALSE
/obj/item/weapon/storage/laundry_basket/offhand/dropped(mob/user as mob)
user.drop_from_inventory(linked)
if(user.isEquipped(linked))
user.drop_from_inventory(linked)
return
+1 -2
View File
@@ -132,8 +132,7 @@
mob_wander_distance = 4
/obj/random/mob/spider/item_to_spawn()
return pick(prob(22);/mob/living/simple_mob/animal/giant_spider/nurse,
prob(33);/mob/living/simple_mob/animal/giant_spider/hunter,
return pick(prob(33);/mob/living/simple_mob/animal/giant_spider/hunter,
prob(45);/mob/living/simple_mob/animal/giant_spider)
/obj/random/mob/spider/nurse
+11
View File
@@ -198,6 +198,17 @@ var/list/flooring_types
'sound/effects/footstep/mud3.ogg',
'sound/effects/footstep/mud4.ogg'))
/decl/flooring/rock
name = "rocks"
desc = "Hard as a rock."
icon = 'icons/turf/outdoors.dmi'
icon_base = "rock"
footstep_sounds = list("human" = list(
'sound/effects/footstep/LightStone1.ogg',
'sound/effects/footstep/LightStone2.ogg',
'sound/effects/footstep/LightStone3.ogg',
'sound/effects/footstep/LightStone4.ogg'))
/decl/flooring/asteroid
name = "coarse sand"
desc = "You got a pebble in your shoe just looking at it."
@@ -123,6 +123,7 @@ var/list/turf_edge_cache = list()
desc = "Hard as a rock."
icon_state = "rock"
edge_blending_priority = 1
initial_flooring = /decl/flooring/rock
/turf/simulated/floor/outdoors/rocks/caves
outdoors = OUTDOORS_NO
@@ -185,4 +186,4 @@ var/list/turf_edge_cache = list()
icon = 'icons/turf/concrete.dmi'
icon_state = "concrete_dark"
desc = "Some sort of material composite road."
edge_blending_priority = -1
edge_blending_priority = -1
+2 -2
View File
@@ -71,9 +71,9 @@
water_state = "cult"
/turf/simulated/floor/water/underwater/ruins
icon = 'maps/atoll/icons/turfs/marble.dmi'
icon = 'maps/redgate/falls/icons/turfs/marble.dmi'
icon_state = "1" // So it shows up in the map editor as water.
water_icon = 'maps/atoll/icons/turfs/marble.dmi'
water_icon = 'maps/redgate/falls/icons/turfs/marble.dmi'
water_state = "1"
/turf/simulated/floor/water/underwater/sand
+29
View File
@@ -73,6 +73,27 @@
water_breath.adjust_gas(gasid, BREATH_MOLES) // They have no oxygen, but non-zero moles and temp
water_breath.temperature = above_air.temperature
return water_breath
if(L && L.is_bad_swimmer() && depth >= 2 && !L.buckled())
if(prob(10))
L.visible_message("<span class='notice'>[L] splashes wildly.</span>","<span class='warning'>You struggle to keep your head above the water!</span>")
if(L.can_breathe_water())
var/datum/gas_mixture/water_breath = new()
var/datum/gas_mixture/above_air = return_air()
var/amount = 300
water_breath.adjust_gas("oxygen", amount) // Assuming water breathes just extract the oxygen directly from the water.
water_breath.temperature = above_air.temperature
return water_breath
else
var/gasid = "carbon_dioxide"
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.species && H.species.exhale_type)
gasid = H.species.exhale_type
var/datum/gas_mixture/water_breath = new()
var/datum/gas_mixture/above_air = return_air()
water_breath.adjust_gas(gasid, BREATH_MOLES) // They have no oxygen, but non-zero moles and temp
water_breath.temperature = above_air.temperature
return water_breath
return return_air() // Otherwise their head is above the water, so get the air from the atmosphere instead.
/turf/simulated/floor/water/Entered(atom/movable/AM, atom/oldloc)
@@ -132,6 +153,14 @@
return species.can_breathe_water()
return ..()
/mob/living/proc/is_bad_swimmer()
return FALSE
/mob/living/carbon/human/is_bad_swimmer()
if(species)
return species.is_bad_swimmer()
return ..()
/mob/living/proc/check_submerged()
if(buckled)
return 0