Grugstation Event Content (#36865)
* Most of the work on content for the grug event done. * Lots more grug content. * Defibrilator eels, nature procgen improvements, etc * Final round of content for grug bus * Standardizes strings so that typos won't break EVERYTHING!! * Adds missing return to fix defib eels. * Rock doors! * Blacklists fireaxes from destroying planetary grass. * Forgot a comma.
@@ -901,3 +901,58 @@
|
||||
H.update_mutations(0)
|
||||
H.update_inv_w_uniform(0)
|
||||
H.update_inv_wear_suit()
|
||||
|
||||
/datum/outfit/special/tribalmale
|
||||
outfit_name = "Male Tribesman"
|
||||
items_to_spawn = list(
|
||||
"Default" = list(
|
||||
slot_w_uniform_str = /obj/item/clothing/under/leather_rags,
|
||||
slot_shoes_str = /obj/item/clothing/shoes/sandal,
|
||||
slot_wear_suit_str = /obj/item/clothing/suit/unathi/mantle,
|
||||
),
|
||||
/datum/species/plasmaman = list(
|
||||
slot_w_uniform_str = /obj/item/clothing/under/leather_rags,
|
||||
slot_shoes_str = /obj/item/clothing/shoes/sandal,
|
||||
slot_wear_suit_str = /obj/item/clothing/suit/unathi/robe/plasmaman,
|
||||
slot_head_str = /obj/item/clothing/head/bearpelt/brown/plasmaman,
|
||||
slot_wear_mask_str = /obj/item/clothing/mask/breath,
|
||||
slot_back_str = /obj/item/weapon/tank/plasma/plasmaman,
|
||||
),
|
||||
/datum/species/vox = list(
|
||||
slot_w_uniform_str = /obj/item/clothing/under/leather_rags,
|
||||
slot_shoes_str = /obj/item/clothing/shoes/sandal,
|
||||
slot_wear_suit_str = /obj/item/clothing/suit/unathi/mantle,
|
||||
slot_wear_mask_str = /obj/item/clothing/mask/breath/vox,
|
||||
slot_back_str = /obj/item/weapon/tank/nitrogen,
|
||||
),
|
||||
)
|
||||
|
||||
/datum/outfit/special/tribalmale/equip_backbag(var/mob/living/carbon/human/H)
|
||||
return FALSE
|
||||
|
||||
/datum/outfit/special/tribalfemale
|
||||
outfit_name = "Female Tribesman"
|
||||
items_to_spawn = list(
|
||||
"Default" = list(
|
||||
slot_w_uniform_str = /obj/item/clothing/under/leather_rags,
|
||||
slot_shoes_str = /obj/item/clothing/shoes/sandal,
|
||||
slot_wear_suit_str = /obj/item/clothing/suit/unathi/robe,
|
||||
),
|
||||
/datum/species/plasmaman = list(
|
||||
slot_w_uniform_str = /obj/item/clothing/under/leather_rags,
|
||||
slot_shoes_str = /obj/item/clothing/shoes/sandal,
|
||||
slot_wear_suit_str = /obj/item/clothing/suit/unathi/robe/plasmaman,
|
||||
slot_head_str = /obj/item/clothing/head/bearpelt/brown/plasmaman,
|
||||
slot_wear_mask_str = /obj/item/clothing/mask/breath,
|
||||
),
|
||||
/datum/species/vox = list(
|
||||
slot_w_uniform_str = /obj/item/clothing/under/leather_rags,
|
||||
slot_shoes_str = /obj/item/clothing/shoes/sandal,
|
||||
slot_wear_suit_str = /obj/item/clothing/suit/unathi/robe,
|
||||
slot_wear_mask_str = /obj/item/clothing/mask/breath/vox,
|
||||
slot_back_str = /obj/item/weapon/tank/nitrogen,
|
||||
),
|
||||
)
|
||||
|
||||
/datum/outfit/special/tribalfemale/equip_backbag(var/mob/living/carbon/human/H)
|
||||
return FALSE
|
||||
|
||||
638
code/game/events/naturify.dm
Normal file
@@ -0,0 +1,638 @@
|
||||
var/list/flora_types = list(
|
||||
/obj/structure/flora/ausbushes/lavendergrass = 10,
|
||||
/obj/structure/flora/ausbushes/sparsegrass = 35,
|
||||
/obj/structure/flora/ausbushes/fullgrass = 20,
|
||||
/obj/structure/flora/rock/pile = 15,
|
||||
/obj/structure/flora/rock = 6,
|
||||
/obj/structure/flora/ausbushes/leafybush = 3,
|
||||
/obj/structure/flora/ausbushes/palebush = 3,
|
||||
/obj/structure/flora/ausbushes/stalkybush = 3,
|
||||
/obj/structure/flora/ausbushes/sunnybush = 3,
|
||||
/obj/structure/flora/ausbushes/genericbush = 3,
|
||||
/obj/structure/flora/ausbushes/pointybush = 3,
|
||||
/obj/structure/flora/ausbushes/ywflowers = 14,
|
||||
/obj/structure/flora/ausbushes/brflowers = 14,
|
||||
/obj/structure/flora/ausbushes/ppflowers = 14,
|
||||
/obj/structure/seedbush = 10,
|
||||
)
|
||||
|
||||
var/list/animal_types = list(
|
||||
/mob/living/simple_animal/hostile/retaliate/goat = 5,
|
||||
/mob/living/simple_animal/cow = 8,
|
||||
/mob/living/simple_animal/hostile/retaliate/box/pig = 9,
|
||||
/mob/living/simple_animal/chicken = 14,
|
||||
/mob/living/simple_animal/rabbit = 12,
|
||||
/mob/living/simple_animal/rabbit/bunny = 12,
|
||||
/mob/living/carbon/complex/gondola = 1,
|
||||
/mob/living/simple_animal/capybara = 1,
|
||||
)
|
||||
|
||||
var/list/cave_decor_types = list(
|
||||
/obj/structure/flora/rock/pile = 160,
|
||||
/obj/structure/flora/rock = 60,
|
||||
/obj/item/device/flashlight/torch = 20,
|
||||
/obj/item/weapon/pickaxe/shovel = 6,
|
||||
/obj/item/weapon/melee/bone_club = 1,
|
||||
/obj/item/weapon/melee/wooden_club = 1,
|
||||
/obj/structure/boulder = 12
|
||||
)
|
||||
|
||||
var/list/beach_decor_types = list(
|
||||
/obj/structure/flora/rock/pile = 30,
|
||||
/obj/structure/flora/coconut = 16,
|
||||
/obj/item/weapon/grown/log/tree = 4,
|
||||
/obj/item/weapon/melee/defib_basic/electric_eel = 4,
|
||||
)
|
||||
|
||||
var/list/beach_animal_types = list(
|
||||
/mob/living/simple_animal/crab = 10,
|
||||
/mob/living/simple_animal/hostile/carp/baby/friendly = 15,
|
||||
/mob/living/simple_animal/hostile/carp/friendly = 10,
|
||||
)
|
||||
|
||||
var/list/ignored_cave_deletion_types = list(/obj/structure/window, /obj/machinery/door/airlock, /obj/structure/grille, /obj/structure/plasticflaps/mining, /obj/machinery/door/poddoor)
|
||||
|
||||
var/list/medicine_cow_possible_reagents = list(ALLICIN, TANNIC_ACID, THYMOL, PHYTOCARISOL, PHYTOSINE)
|
||||
|
||||
var/list/seedbush_spawns = list(
|
||||
/obj/item/seeds/bananaseed = 10,
|
||||
/obj/item/seeds/berryseed = 10,
|
||||
/obj/item/seeds/carrotseed = 10,
|
||||
/obj/item/seeds/chantermycelium = 10,
|
||||
/obj/item/seeds/chiliseed = 10,
|
||||
/obj/item/seeds/cornseed = 10,
|
||||
/obj/item/seeds/eggplantseed = 10,
|
||||
/obj/item/seeds/potatoseed = 10,
|
||||
/obj/item/seeds/dionanode = 10,
|
||||
/obj/item/seeds/soyaseed = 10,
|
||||
/obj/item/seeds/sunflowerseed = 10,
|
||||
/obj/item/seeds/tomatoseed = 10,
|
||||
/obj/item/seeds/towermycelium = 10,
|
||||
/obj/item/seeds/wheatseed = 10,
|
||||
/obj/item/seeds/appleseed = 10,
|
||||
/obj/item/seeds/poppyseed = 10,
|
||||
/obj/item/seeds/ambrosiavulgarisseed = 10,
|
||||
/obj/item/seeds/whitebeetseed = 10,
|
||||
/obj/item/seeds/sugarcaneseed = 10,
|
||||
/obj/item/seeds/watermelonseed = 10,
|
||||
/obj/item/seeds/limeseed = 10,
|
||||
/obj/item/seeds/lemonseed = 10,
|
||||
/obj/item/seeds/orangeseed = 10,
|
||||
/obj/item/seeds/grassseed = 10,
|
||||
/obj/item/seeds/cloverseed = 10,
|
||||
/obj/item/seeds/cocoapodseed = 10,
|
||||
/obj/item/seeds/cabbageseed = 10,
|
||||
/obj/item/seeds/grapeseed = 10,
|
||||
/obj/item/seeds/pumpkinseed = 10,
|
||||
/obj/item/seeds/cherryseed = 10,
|
||||
/obj/item/seeds/plastiseed = 10,
|
||||
/obj/item/seeds/riceseed = 10,
|
||||
/obj/item/seeds/cinnamomum = 10,
|
||||
/obj/item/seeds/avocadoseed = 10,
|
||||
/obj/item/seeds/pearseed = 10,
|
||||
/obj/item/seeds/peanutseed = 10,
|
||||
/obj/item/seeds/mustardplantseed = 10,
|
||||
/obj/item/seeds/flaxseed = 10,
|
||||
/obj/item/seeds/amanitamycelium = 6,
|
||||
/obj/item/seeds/glowshroom = 6,
|
||||
/obj/item/seeds/libertymycelium = 6,
|
||||
/obj/item/seeds/nettleseed = 6,
|
||||
/obj/item/seeds/plumpmycelium = 6,
|
||||
/obj/item/seeds/reishimycelium = 6,
|
||||
/obj/item/seeds/harebell = 6,
|
||||
)
|
||||
|
||||
/**
|
||||
Return your station to nature.
|
||||
All walls become wood. All floors become grass or stone. The station is populated with
|
||||
animals, trees, and other nature things, as well as some interesting tidbits.
|
||||
|
||||
All APC's are gone. All batteries are drained. Electricity no longer operates.
|
||||
*/
|
||||
|
||||
/proc/naturify_station()
|
||||
var/target_zlevel = map.zMainStation
|
||||
for(var/area/target in areas)
|
||||
// Note: there should really be a better way to check whether it's the space area...
|
||||
if(target.name != "Space" && target.z == target_zlevel)
|
||||
if(istype(target, /area/hallway))
|
||||
break_room(target)
|
||||
grassify_room(target, spawn_flora=TRUE, spawn_trees=TRUE, spawn_animals=TRUE)
|
||||
else if(istype(target, /area/crew_quarters/bar))
|
||||
break_room(target)
|
||||
grassify_room(target, spawn_flora=TRUE, spawn_medicine_cows=TRUE)
|
||||
else if(istype(target, /area/security/armory))
|
||||
break_room(target)
|
||||
caveify_room(target)
|
||||
generate_bear_den(target)
|
||||
else if(istype(target, /area/maintenance))
|
||||
clear_objects_in_room(target, ignored_cave_deletion_types)
|
||||
break_room(target)
|
||||
caveify_room(target)
|
||||
else if(istype(target, /area/medical))
|
||||
break_room(target)
|
||||
beachify_room(target)
|
||||
else
|
||||
break_room(target)
|
||||
grassify_room(target, spawn_flora=TRUE)
|
||||
for(var/area/target in areas)
|
||||
if(target.name != "Space" && target.z == target_zlevel)
|
||||
for(var/turf/simulated/wall/W in target)
|
||||
// Before roundstart, the walls don't visually connect with each other unless we call this.
|
||||
W.relativewall()
|
||||
to_chat(map.zLevels[target_zlevel], "<span class='sinister'>You blink, and suddenly the smell of grass permeates the air...</span>")
|
||||
|
||||
/// Turns a room grassy and makes the walls wooden. Other options are available for other nature-related spawns.
|
||||
/proc/grassify_room(var/area/target, var/spawn_flora=TRUE, var/spawn_trees=FALSE, var/spawn_animals=FALSE, var/spawn_medicine_cows=FALSE)
|
||||
for(var/turf/T in target)
|
||||
if(istype(T, /turf/simulated/floor/))
|
||||
T.ChangeTurf(/turf/simulated/floor/planetary_grass)
|
||||
else if(istype(T, /turf/simulated/wall) || istype(T, /turf/simulated/wall/r_wall))
|
||||
T.ChangeTurf(/turf/simulated/wall/mineral/wood, tell_universe = 0)
|
||||
|
||||
for(var/obj/machinery/light/L in target)
|
||||
var/obj/structure/hanging_lantern/HL = new /obj/structure/hanging_lantern(L.loc)
|
||||
HL.dir = L.dir
|
||||
HL.lantern_can_be_removed = FALSE
|
||||
HL.update()
|
||||
qdel(L)
|
||||
|
||||
for(var/obj/machinery/door/airlock/AL in target)
|
||||
if(!istype(AL, /obj/machinery/door/airlock/external))
|
||||
new /obj/machinery/door/mineral/wood/log(AL.loc)
|
||||
qdel(AL)
|
||||
for(var/obj/machinery/door/unpowered/shuttle/S in target)
|
||||
new /obj/machinery/door/mineral/wood/log(S.loc)
|
||||
qdel(S)
|
||||
|
||||
if(spawn_flora)
|
||||
for(var/turf/simulated/floor/F in target)
|
||||
if(!F.has_dense_content() && prob(55))
|
||||
var/flora_type = pickweight(flora_types)
|
||||
new flora_type(F)
|
||||
|
||||
if(spawn_trees)
|
||||
for(var/turf/simulated/floor/F in target)
|
||||
if(!F.has_dense_content() && prob(5))
|
||||
for(var/obj/O in F)
|
||||
qdel(O)
|
||||
new/obj/structure/flora/tree/shitty(F)
|
||||
|
||||
if(spawn_animals)
|
||||
for(var/turf/simulated/floor/F in target)
|
||||
if(!F.has_dense_content() && prob(4))
|
||||
var/animal_type = pickweight(animal_types)
|
||||
new animal_type(F)
|
||||
|
||||
if(spawn_medicine_cows)
|
||||
for(var/turf/simulated/floor/F in target)
|
||||
if(!F.has_dense_content() && prob(8))
|
||||
var/mob/living/simple_animal/cow/medical_cow = generate_medicine_cow()
|
||||
medical_cow.forceMove(F)
|
||||
|
||||
|
||||
/// Turns a room into a cave with rocks. Perfect for a caveman.
|
||||
/proc/caveify_room(var/area/target)
|
||||
for(var/turf/T in target)
|
||||
if(istype(T, /turf/simulated/floor/))
|
||||
T.ChangeTurf(/turf/simulated/floor/asteroid/air)
|
||||
else if(istype(T, /turf/simulated/wall) || istype(T, /turf/simulated/wall/r_wall))
|
||||
T.ChangeTurf(/turf/unsimulated/mineral/random/air, tell_universe = 1)
|
||||
|
||||
for(var/turf/simulated/floor/F in target)
|
||||
if(!F.has_dense_content() && prob(25))
|
||||
var/cave_decor_type = pickweight(cave_decor_types)
|
||||
new cave_decor_type(F)
|
||||
|
||||
for(var/obj/machinery/door/airlock/AL in target)
|
||||
if(!istype(AL, /obj/machinery/door/airlock/external))
|
||||
new /obj/machinery/door/mineral/rock_door(AL.loc)
|
||||
qdel(AL)
|
||||
|
||||
for(var/obj/machinery/light/L in target)
|
||||
var/obj/structure/hanging_lantern/HL = new /obj/structure/hanging_lantern/dim(L.loc)
|
||||
HL.dir = L.dir
|
||||
HL.lantern_can_be_removed = FALSE
|
||||
HL.update()
|
||||
qdel(L)
|
||||
|
||||
/proc/beachify_room(var/area/target)
|
||||
for(var/turf/T in target)
|
||||
if(istype(T, /turf/simulated/floor/))
|
||||
T.ChangeTurf(/turf/simulated/floor/beach/sand)
|
||||
else if(istype(T, /turf/simulated/wall) || istype(T, /turf/simulated/wall/r_wall))
|
||||
T.ChangeTurf(/turf/unsimulated/mineral/random/air, tell_universe = 1)
|
||||
|
||||
for(var/obj/machinery/light/L in target)
|
||||
var/obj/structure/hanging_lantern/HL = new /obj/structure/hanging_lantern(L.loc)
|
||||
HL.dir = L.dir
|
||||
HL.lantern_can_be_removed = FALSE
|
||||
HL.update()
|
||||
qdel(L)
|
||||
|
||||
for(var/obj/machinery/door/airlock/AL in target)
|
||||
if(!istype(AL, /obj/machinery/door/airlock/external))
|
||||
new /obj/machinery/door/mineral/wood/log(AL.loc)
|
||||
qdel(AL)
|
||||
for(var/obj/machinery/door/unpowered/shuttle/S in target)
|
||||
new /obj/machinery/door/mineral/wood/log(S.loc)
|
||||
qdel(S)
|
||||
|
||||
for(var/turf/simulated/floor/F in target)
|
||||
if(!F.has_dense_content() && prob(5))
|
||||
for(var/obj/O in F)
|
||||
qdel(O)
|
||||
new/obj/structure/flora/tree/palm(F)
|
||||
|
||||
|
||||
for(var/turf/simulated/floor/F in target)
|
||||
if(!F.has_dense_content() && prob(13))
|
||||
var/flora_type = pickweight(beach_decor_types)
|
||||
new flora_type(F)
|
||||
|
||||
for(var/turf/simulated/floor/F in target)
|
||||
if(!F.has_dense_content() && prob(4))
|
||||
var/animal_type = pickweight(beach_animal_types)
|
||||
new animal_type(F)
|
||||
|
||||
|
||||
/proc/generate_bear_den(var/area/target)
|
||||
for(var/turf/simulated/floor/F in target)
|
||||
if(!F.has_dense_content() && prob(15))
|
||||
new /mob/living/simple_animal/hostile/bear(F)
|
||||
|
||||
/// Does various things to make the room look old and run down. For instance, breaks machines, eliminates power, etc.
|
||||
/proc/break_room(var/area/target)
|
||||
for(var/obj/machinery/power/apc in target)
|
||||
qdel(apc)
|
||||
|
||||
for(var/obj/machinery/M in target)
|
||||
if(!istype(M, /obj/machinery/computer) && prob(50))
|
||||
M.stat |= BROKEN
|
||||
|
||||
for(var/obj/machinery/camera/C in target)
|
||||
C.deactivate(null)
|
||||
|
||||
// Recursive check to uncharge all cells. Bit laggy!
|
||||
for(var/turf/T in target)
|
||||
uncharge_all_cells_recursive(T)
|
||||
|
||||
/proc/uncharge_all_cells_recursive(var/atom/A)
|
||||
var/obj/item/weapon/cell/C = A
|
||||
if(istype(C))
|
||||
C.charge = 0
|
||||
for(var/atom/content in A.contents)
|
||||
uncharge_all_cells_recursive(content)
|
||||
A.update_icon()
|
||||
|
||||
/proc/clear_objects_in_room(var/area/target, var/list/blacklist)
|
||||
for(var/turf/T in target)
|
||||
if(istype(T, /turf/simulated/floor/))
|
||||
for(var/obj/O in T)
|
||||
var/should_be_deleted = TRUE
|
||||
for(var/blacklisted_type in blacklist)
|
||||
if(istype(O, blacklisted_type))
|
||||
should_be_deleted = FALSE
|
||||
break
|
||||
if(should_be_deleted)
|
||||
qdel(O)
|
||||
|
||||
/proc/generate_medicine_cow()
|
||||
var/mob/living/simple_animal/cow/medicine_cow = new /mob/living/simple_animal/cow
|
||||
medicine_cow.name = "medical cow"
|
||||
medicine_cow.desc = "The cows will heal him."
|
||||
medicine_cow.milktype = pick(medicine_cow_possible_reagents)
|
||||
medicine_cow.min_reagent_regen_per_tick = 2
|
||||
medicine_cow.max_reagent_regen_per_tick = 3
|
||||
medicine_cow.reagent_regen_chance_per_tick = 15
|
||||
medicine_cow.milkable_reagents.maximum_volume = 30
|
||||
return medicine_cow
|
||||
|
||||
|
||||
|
||||
/obj/structure/seedbush
|
||||
name = "seed bush"
|
||||
desc = "This mysterious bush of grass is genetically modified to produce a type of seed when harvested."
|
||||
icon = 'icons/obj/flora/ausflora.dmi'
|
||||
icon_state = "grassybush_1"
|
||||
|
||||
/obj/structure/seedbush/New()
|
||||
..()
|
||||
icon_state = "grassybush_[rand(1, 4)]"
|
||||
|
||||
/obj/structure/seedbush/attack_hand(mob/user)
|
||||
var/seed_type = pickweight(seedbush_spawns)
|
||||
var/obj/item/seeds/harvested_seed = new seed_type(user.loc)
|
||||
user.put_in_active_hand(harvested_seed)
|
||||
playsound(loc, "sound/effects/plant_rustle.ogg", 50, 1, -1)
|
||||
user.visible_message("<span class='notice'>[user] harvests \the [harvested_seed] from \the [src].</span>", "You harvest \the [harvested_seed] from \the [src].")
|
||||
if(prob(60))
|
||||
qdel(src)
|
||||
|
||||
|
||||
|
||||
/turf/simulated/floor/planetary_grass
|
||||
name = "Grass"
|
||||
icon = 'icons/turf/floors.dmi'
|
||||
icon_state = "grass1"
|
||||
plane = PLATING_PLANE
|
||||
flammable = FALSE
|
||||
var/dirt_left = 10
|
||||
|
||||
/turf/simulated/floor/planetary_grass/update_icon()
|
||||
return
|
||||
|
||||
/turf/simulated/floor/planetary_grass/create_floor_tile()
|
||||
return
|
||||
|
||||
/turf/simulated/floor/planetary_grass/New()
|
||||
icon_state = "grass[pick("1","2","3","4")]"
|
||||
..()
|
||||
spawn(4)
|
||||
if(src)
|
||||
update_icon()
|
||||
for(var/direction in cardinal)
|
||||
if(istype(get_step(src,direction),/turf/simulated/floor))
|
||||
var/turf/simulated/floor/FF = get_step(src,direction)
|
||||
FF.update_icon()
|
||||
|
||||
/turf/simulated/floor/planetary_grass/canBuildLattice()
|
||||
if(src.x >= (world.maxx - TRANSITIONEDGE) || src.x <= TRANSITIONEDGE)
|
||||
return BUILD_FAILURE
|
||||
else if (src.y >= (world.maxy - TRANSITIONEDGE || src.y <= TRANSITIONEDGE ))
|
||||
return BUILD_FAILURE
|
||||
else if(!(locate(/obj/structure/lattice) in contents))
|
||||
return BUILD_SUCCESS
|
||||
|
||||
/turf/simulated/floor/planetary_grass/canBuildCatwalk()
|
||||
return BUILD_FAILURE
|
||||
|
||||
/turf/simulated/floor/planetary_grass/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
..()
|
||||
if(isshovel(W))
|
||||
if(dirt_left > 0)
|
||||
user.visible_message("<span class='notice'>[user] digs out some dirt with \the [W].</span>", \
|
||||
"<span class='notice'>You dig out some dirt with \the [W].</span>")
|
||||
playsound(src, 'sound/items/shovel.ogg', 50, 1)
|
||||
var/amount = min(dirt_left, 2)
|
||||
dirt_left -= amount
|
||||
drop_stack(/obj/item/stack/ore/glass, src, amount)
|
||||
user.delayNextAttack(20)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There's not enough dirt left here to dig anymore!</span>")
|
||||
return
|
||||
|
||||
/obj/structure/flora/tree/shitty
|
||||
icon = 'icons/obj/flora/trees.dmi'
|
||||
icon_state = "shittytree"
|
||||
randomize_on_creation = FALSE
|
||||
|
||||
/obj/structure/flora/tree/palm
|
||||
name = "Palm tree"
|
||||
desc = "The coconut-nut is a giant nut!"
|
||||
icon = 'icons/misc/beach2.dmi'
|
||||
icon_state = "palm1"
|
||||
pixel_x = 0
|
||||
|
||||
/obj/structure/flora/tree/palm/New()
|
||||
icon_state = "palm[rand(1,2)]"
|
||||
|
||||
/obj/item/clothing/suit/unathi/robe/plasmaman
|
||||
name = "plasmaman robes"
|
||||
desc = "Somehow these robes keep a plasmaman safe, even outside of plasma."
|
||||
species_restricted = list(PLASMAMAN_SHAPED)
|
||||
species_fit = list(PLASMAMAN_SHAPED)
|
||||
clothing_flags = PLASMAGUARD|CONTAINPLASMAMAN
|
||||
body_parts_covered = ARMS|LEGS|FULL_TORSO|FEET|HANDS
|
||||
|
||||
/obj/item/clothing/head/bearpelt/brown/plasmaman
|
||||
name = "plasmaman wolf pelt"
|
||||
desc = "Somehow this wolf pelt keep a plasmaman safe, even outside of plasma."
|
||||
species_restricted = list(PLASMAMAN_SHAPED)
|
||||
species_fit = list(PLASMAMAN_SHAPED)
|
||||
clothing_flags = PLASMAGUARD|CONTAINPLASMAMAN
|
||||
hides_identity = HIDES_IDENTITY_NEVER
|
||||
body_parts_covered = FULL_HEAD|HIDEHAIR
|
||||
|
||||
/obj/item/clothing/head/helmet/space/plasmaman
|
||||
name = "plasmaman helmet"
|
||||
desc = "A special containment helmet designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies."
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/melee/defib_basic
|
||||
name = "emergency defibrillator"
|
||||
desc = "Used to restore fibrillating patients."
|
||||
var/defib_delay = 30
|
||||
var/ignores_clothes = FALSE
|
||||
|
||||
/obj/item/weapon/melee/defib_basic/attack(mob/M, mob/user)
|
||||
if(!ishuman(M))
|
||||
to_chat(user, "<span class='warning'>You can't defibrillate [M]. You don't even know where to put the [src]!</span>")
|
||||
else
|
||||
var/mob/living/carbon/human/target = M
|
||||
if(!(target.stat == 2 || target.stat == DEAD))
|
||||
to_chat(user, "<span class='warning'>[src] buzzes: Vital signs detected.</span>")
|
||||
else
|
||||
attempt_defib(target, user)
|
||||
return
|
||||
|
||||
/obj/item/weapon/melee/defib_basic/proc/display_start_message(mob/living/carbon/human/target, mob/user)
|
||||
user.visible_message("<span class='notice'>[user] starts setting up the [src] on [target]'s chest.</span>", \
|
||||
"<span class='notice'>You start setting up the [src] on [target]'s chest.</span>")
|
||||
|
||||
/obj/item/weapon/melee/defib_basic/proc/attempt_defib(mob/living/carbon/human/target, mob/user)
|
||||
display_start_message(target, user)
|
||||
if(target.mind && !target.client && target.get_heart() && target.get_organ(LIMB_HEAD) && target.has_brain() && !target.mind.suiciding && target.health+target.getOxyLoss() > config.health_threshold_dead)
|
||||
target.ghost_reenter_alert("Someone is about to try to defibrillate your body. Return to it if you want to be resurrected!")
|
||||
if(do_after(user,target,defib_delay))
|
||||
if(pre_defib_check(target, user))
|
||||
perform_defib(target, user)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/weapon/melee/defib_basic/proc/pre_defib_check(mob/living/carbon/human/target, mob/user)
|
||||
return TRUE
|
||||
|
||||
/obj/item/weapon/melee/defib_basic/proc/post_defib_actions(mob/living/carbon/human/target, mob/user)
|
||||
return
|
||||
|
||||
/obj/item/weapon/melee/defib_basic/proc/perform_defib(mob/living/carbon/human/target, mob/user)
|
||||
spark(src, 5, FALSE)
|
||||
playsound(src,'sound/items/defib.ogg',50,1)
|
||||
update_icon()
|
||||
to_chat(user, "<span class='notice'>You shock [target] with the [src].</span>")
|
||||
var/datum/organ/internal/heart/heart = target.get_heart()
|
||||
if(!heart)
|
||||
target.visible_message("<span class='warning'>[src] buzzes: Defibrillation failed. Subject requires a heart.</span>")
|
||||
target.apply_damage(rand(1,5),BURN,LIMB_CHEST)
|
||||
return
|
||||
var/datum/organ/external/head/head = target.get_organ(LIMB_HEAD)
|
||||
if(!head || head.status & ORGAN_DESTROYED)
|
||||
target.visible_message("<span class='warning'>[src] buzzes: Defibrillation failed. Severe cranial damage detected.</span>")
|
||||
return
|
||||
if((M_HUSK in target.mutations) && (M_NOCLONE in target.mutations))
|
||||
target.visible_message("<span class='warning'>[src] buzzes: Defibrillation failed. Irremediable genetic damage detected.</span>")
|
||||
return
|
||||
if(!target.has_brain())
|
||||
target.visible_message("<span class='warning'>[src] buzzes: Defibrillation failed. No central nervous system detected.</span>")
|
||||
return
|
||||
if(!target.has_attached_brain())
|
||||
target.visible_message("<span class='warning'>[src] buzzes: Defibrillation failed. Central nervous system detachment detected.</span>")
|
||||
return
|
||||
if(target.mind && target.mind.suiciding)
|
||||
target.visible_message("<span class='warning'>[src] buzzes: Defibrillation failed. Unrecoverable nerve trauma detected.</span>") // They suicided so they fried their brain. Space Magic.
|
||||
return
|
||||
if(!ignores_clothes)
|
||||
if(istype(target.wear_suit,/obj/item/clothing/suit/armor) && (target.wear_suit.body_parts_covered & UPPER_TORSO) && prob(95)) //75 ? Let's stay realistic here
|
||||
target.visible_message("<span class='warning'>[src] buzzes: Defibrillation failed. Please apply on bare skin.</span>")
|
||||
target.apply_damage(rand(1,5),BURN,LIMB_CHEST)
|
||||
return
|
||||
if(istype(target.w_uniform,/obj/item/clothing/under) && (target.w_uniform.body_parts_covered & UPPER_TORSO) && prob(50))
|
||||
target.visible_message("<span class='warning'>[src] buzzes: Defibrillation failed. Please apply on bare skin.</span>")
|
||||
target.apply_damage(rand(1,5),BURN,LIMB_CHEST)
|
||||
return
|
||||
if(target.mind && !target.client) //Let's call up the ghost! Also, bodies with clients only, thank you.
|
||||
target.visible_message("<span class='warning'>[src] buzzes: Defibrillation failed. [target.ghost_reenter_alert("Someone has tried to defibrillate your body. Return to it if you want to be resurrected!") ? "Vital signs are too weak, please try again in five seconds" : "No brainwaves detected"].</span>")
|
||||
return
|
||||
target.apply_damage(-target.getOxyLoss(),OXY)
|
||||
target.updatehealth()
|
||||
target.visible_message("<span class='danger'>[target]'s body convulses a bit.</span>")
|
||||
if(target.health > config.health_threshold_dead)
|
||||
target.timeofdeath = 0
|
||||
target.visible_message("<span class='notice'>[src] beeps: Defibrillation successful.</span>")
|
||||
|
||||
target.resurrect()
|
||||
|
||||
target.tod = null
|
||||
target.stat = target.status_flags & BUDDHAMODE ? CONSCIOUS : UNCONSCIOUS
|
||||
target.regenerate_icons()
|
||||
target.update_canmove()
|
||||
target.flash_eyes(visual = 1)
|
||||
target.apply_effect(10, EYE_BLUR) //I'll still put this back in to avoid dumb "pounce back up" behavior
|
||||
target.apply_effect(10, PARALYZE)
|
||||
target.update_canmove()
|
||||
has_been_shade.Remove(target.mind)
|
||||
to_chat(target, "<span class='notice'>You suddenly feel a spark and your consciousness returns, dragging you back to the mortal plane.</span>")
|
||||
post_defib_actions(target, user)
|
||||
else
|
||||
target.visible_message("<span class='warning'>[src] buzzes: Defibrillation failed. Patient's condition does not allow reviving.</span>")
|
||||
return
|
||||
|
||||
/obj/item/weapon/melee/defib_basic/electric_eel
|
||||
name = "defibrillating eel"
|
||||
desc = "Slimy... but also a highly versatile weapon."
|
||||
icon = 'icons/obj/fish_items.dmi'
|
||||
icon_state = "electric_eel_full"
|
||||
var/charge = 50
|
||||
var/max_charge = 50
|
||||
var/recharge_rate_per_tick = 0.15
|
||||
var/revive_charge_usage = 15
|
||||
var/attack_charge_usage = 5
|
||||
|
||||
/obj/item/weapon/melee/defib_basic/electric_eel/New()
|
||||
..()
|
||||
processing_objects.Add(src)
|
||||
|
||||
/obj/item/weapon/melee/defib_basic/electric_eel/Destroy()
|
||||
processing_objects.Remove(src)
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/weapon/melee/defib_basic/electric_eel/process()
|
||||
charge = min(max_charge, charge + recharge_rate_per_tick)
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/melee/defib_basic/electric_eel/update_icon()
|
||||
if(charge > max_charge * 0.7)
|
||||
icon_state = "electric_eel_full"
|
||||
else if(charge > max_charge * 0.2)
|
||||
icon_state = "electric_eel_half"
|
||||
else
|
||||
icon_state = "electric_eel_low"
|
||||
|
||||
/obj/item/weapon/melee/defib_basic/electric_eel/examine(mob/user)
|
||||
..()
|
||||
if(charge > max_charge * 0.7)
|
||||
to_chat(user, "<span class='notice'>It's brimming with electricity!</span>")
|
||||
else if(charge > max_charge * 0.3)
|
||||
to_chat(user, "<span class='notice'>It's got some electricity in it.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There's hardly any electricity left in it.</span>")
|
||||
|
||||
/obj/item/weapon/melee/defib_basic/electric_eel/attack(mob/M, mob/user)
|
||||
if(user.a_intent == I_HURT)
|
||||
var/charge_fullness = charge / max_charge
|
||||
var/electric_damage = rand(5, 17) * charge_fullness
|
||||
var/brute_damage = rand(4, 7)
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(istype(H))
|
||||
if (charge > attack_charge_usage && H.electrocute_act(electric_damage, src, def_zone = LIMB_CHEST))
|
||||
var/datum/organ/internal/heart/heart = H.get_heart()
|
||||
if(heart)
|
||||
heart.damage += rand(2,4)
|
||||
H.audible_scream()
|
||||
charge = max(0, charge - attack_charge_usage)
|
||||
playsound(src, "sparks", 70, 1)
|
||||
H.adjustBruteLoss(brute_damage)
|
||||
spawn()
|
||||
user.attack_log += "\[[time_stamp()]\]<font color='red'> Shocked [H] ([H.ckey]) with [src]</font>"
|
||||
H.attack_log += "\[[time_stamp()]\]<font color='orange'> Shocked by [user] ([user.ckey]) with [src]</font>"
|
||||
log_attack("<font color='red'>[user] ([user.ckey]) shocked [H] ([H.ckey]) with [src]</font>" )
|
||||
H.assaulted_by(user)
|
||||
playsound(src,'sound/effects/fishslap.ogg', 60, 1)
|
||||
if(prob(15))
|
||||
user.drop_from_inventory(src)
|
||||
user.visible_message("<span class='notice'>[src] slips right out of [user]'s hand!.</span>", \
|
||||
"<span class='notice'>[src] slips right out of your hand!</span>")
|
||||
update_icon()
|
||||
else
|
||||
var/mob/living/L = M
|
||||
if(istype(L))
|
||||
if (charge > attack_charge_usage)
|
||||
L.take_organ_damage(burn=electric_damage)
|
||||
charge = max(0, charge - attack_charge_usage)
|
||||
playsound(L, "sparks", 70, 1)
|
||||
spark(L.loc, 5)
|
||||
L.take_organ_damage(brute=brute_damage)
|
||||
playsound(src,'sound/effects/fishslap.ogg', 60, 1)
|
||||
update_icon()
|
||||
if(prob(15))
|
||||
user.drop_from_inventory(src)
|
||||
user.visible_message("<span class='notice'>[src] slips right out of [user]'s hand!.</span>", \
|
||||
"<span class='notice'>[src] slips right out of your hand!</span>")
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You can't hit [M] with the [src]! That's just wrong!</span>")
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/defib_basic/proc/electric_eel(mob/living/carbon/human/target, mob/user)
|
||||
user.visible_message("<span class='notice'>[user] starts pressing the [src] onto [target]'s chest.</span>", \
|
||||
"<span class='notice'>You start pressing the [src] onto [target]'s chest</span>")
|
||||
|
||||
/obj/item/weapon/melee/defib_basic/electric_eel/pre_defib_check(mob/living/carbon/human/target, mob/user)
|
||||
if(charge < revive_charge_usage)
|
||||
to_chat(user, "<span class='notice'>[src] doesn't feel lively enough to revive someone! Wait some time.</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/weapon/melee/defib_basic/electric_eel/post_defib_actions(mob/living/carbon/human/target, mob/user)
|
||||
charge = min(0, charge-revive_charge_usage)
|
||||
|
||||
|
||||
/obj/structure/flora/coconut
|
||||
plane = OBJ_PLANE
|
||||
name = "Coconuts"
|
||||
icon = 'icons/misc/beach.dmi'
|
||||
icon_state = "coconuts"
|
||||
|
||||
/obj/machinery/door/mineral/rock_door
|
||||
name = "Rock door"
|
||||
desc = "It's a lot of effort to use this thing..."
|
||||
icon = 'icons/obj/doors/rockdoor.dmi'
|
||||
icon_state = "rockdoor_closed"
|
||||
prefix = "rock"
|
||||
@@ -56,6 +56,9 @@ var/list/poddoors = list()
|
||||
poddoors -= src
|
||||
..()
|
||||
|
||||
/obj/machinery/door/poddoor/update_icon()
|
||||
return
|
||||
|
||||
/obj/machinery/door/poddoor/Bumped(atom/AM)
|
||||
if(!density)
|
||||
return ..()
|
||||
|
||||
@@ -47,6 +47,9 @@
|
||||
setDensity(FALSE)
|
||||
..()
|
||||
|
||||
/obj/machinery/door/window/update_icon()
|
||||
return
|
||||
|
||||
/obj/machinery/door/window/proc/smart_toggle() //For "smart" windows
|
||||
// var/color = window_is_opaque ? "#FFFFFF" : "#222222" //these are backwards because we're changing window_is_opaque later
|
||||
// animate(src, color=color, time=5)
|
||||
|
||||
@@ -499,6 +499,7 @@ var/list/datum/stack_recipe/wood_recipes = list (
|
||||
new/datum/stack_recipe("sword handle", /obj/item/sword_handle, 1,2,10, time = 2 SECONDS, other_reqs = list(/obj/item/stack/sheet/metal = 1)),
|
||||
new/datum/stack_recipe("wooden paddle", /obj/item/weapon/macuahuitl, 1, time = 50 ),
|
||||
new/datum/stack_recipe("baseball bat", /obj/item/weapon/bat, 10, time = 8 SECONDS ),
|
||||
new/datum/stack_recipe("wooden club", /obj/item/weapon/melee/wooden_club, 8, time = 8 SECONDS ),
|
||||
)
|
||||
|
||||
/* =========================================================================
|
||||
|
||||
@@ -85,7 +85,8 @@
|
||||
/turf/simulated/floor/engine,
|
||||
/turf/simulated/floor/beach,
|
||||
/turf/simulated/floor/shuttle,
|
||||
/turf/simulated/floor/plating/snow
|
||||
/turf/simulated/floor/plating/snow,
|
||||
/turf/simulated/floor/planetary_grass
|
||||
)
|
||||
|
||||
/obj/item/weapon/fireaxe/update_wield(mob/user)
|
||||
|
||||
@@ -498,6 +498,40 @@
|
||||
user.update_inv_hands()
|
||||
return
|
||||
|
||||
/obj/item/weapon/melee/wooden_club
|
||||
name = "wooden club"
|
||||
desc = "Grug go bonk!"
|
||||
icon_state = "woodenclub"
|
||||
hitsound = "sound/weapons/baseball_hit_flesh.ogg"
|
||||
inhand_states = list("left_hand" = 'icons/mob/in-hand/left/swords_axes.dmi', "right_hand" = 'icons/mob/in-hand/right/swords_axes.dmi')
|
||||
force = 14
|
||||
throwforce = 12
|
||||
throw_speed = 1
|
||||
throw_range = 7
|
||||
w_class = W_CLASS_LARGE
|
||||
w_type = RECYK_WOOD
|
||||
flammable = TRUE
|
||||
var/brain_damage_amount = 3
|
||||
|
||||
/obj/item/weapon/melee/wooden_club/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
var/mob/living/living_target = target
|
||||
if(istype(living_target))
|
||||
living_target.adjustBrainLoss(brain_damage_amount)
|
||||
|
||||
/obj/item/weapon/melee/bone_club
|
||||
name = "bone club"
|
||||
desc = "It's more of a hammer, really."
|
||||
icon_state = "boneclub"
|
||||
hitsound = "sound/weapons/baseball_hit_flesh.ogg"
|
||||
inhand_states = list("left_hand" = 'icons/mob/in-hand/left/swords_axes.dmi', "right_hand" = 'icons/mob/in-hand/right/swords_axes.dmi')
|
||||
force = 19
|
||||
throwforce = 12
|
||||
throw_speed = 1
|
||||
throw_range = 7
|
||||
w_class = W_CLASS_LARGE
|
||||
w_type = RECYK_BIOLOGICAL
|
||||
flammable = FALSE
|
||||
|
||||
/obj/item/weapon/bat
|
||||
name = "baseball bat"
|
||||
desc = "Good for reducing a doubleheader to a zeroheader."
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
|
||||
var/falling_dir = 0 //Direction in which spawned logs are thrown.
|
||||
|
||||
var/const/randomize_on_creation = 1
|
||||
var/randomize_on_creation = 1
|
||||
var/const/log_type = /obj/item/weapon/grown/log/tree
|
||||
var/holo = FALSE
|
||||
var/image/transparent
|
||||
|
||||
@@ -883,6 +883,7 @@ var/global/floorIsLava = 0
|
||||
<A href='?src=\ref[src];secretsfun=flicklights'>Ghost Mode</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=monkey'>Turn all humans into monkeys</A><BR>
|
||||
<BR>
|
||||
<A href='?src=\ref[src];secretsfun=mass_equip_outfit'>Equip outfit on all player humans</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=sec_all_clothes'>Remove ALL clothing</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=retardify'>Make all players retarded</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=fakeguns'>Make all items look like guns (traitor revolvers)</A><BR>
|
||||
@@ -901,6 +902,11 @@ var/global/floorIsLava = 0
|
||||
<A href='?src=\ref[src];secretsfun=bombernodestroy'>Make Bomberman Bombs harmless to the environment (default)</A><BR>
|
||||
<BR>
|
||||
<A href='?src=\ref[src];secretsfun=mechanics_motivator'>Incentivize Mechanics to do their job</A><BR>
|
||||
<BR>
|
||||
<B>Major Station Transformations</B><BR>
|
||||
<A href='?src=\ref[src];secretsfun=naturify'>Return the station to nature</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=christmas_vic'>Make the station christmasy</A><BR>
|
||||
<BR>
|
||||
<B>Final Solutions</B><BR>
|
||||
<I>(Warning, these will end the round!)</I><BR>
|
||||
<BR>
|
||||
@@ -908,7 +914,6 @@ var/global/floorIsLava = 0
|
||||
<A href='?src=\ref[src];secretsfun=supermattercascade'>Start a Supermatter Cascade</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=meteorstorm'>Trigger an undending Meteor Storm</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=halloween'>Trigger the blood moon</A><BR>
|
||||
<A href='?src=\ref[src];secretsfun=christmas_vic'>Make the station christmasy</A><BR>
|
||||
"}
|
||||
|
||||
if(check_rights(R_SERVER,0))
|
||||
|
||||
@@ -3678,6 +3678,23 @@
|
||||
var/dis_level = clamp(round((dis.get_total_badness()+1)/2),1,8)
|
||||
spawn(rand(0,3000))
|
||||
biohazard_alert(dis_level)
|
||||
if("mass_equip_outfit")
|
||||
var/const/yes_choice = "Yeah!"
|
||||
var/const/no_choice = "Nah."
|
||||
var/const/cancel_choice = "Cancel"
|
||||
var/choice = input("Do you want to delete existing clothing instead of drop?") in list(yes_choice, no_choice, cancel_choice)
|
||||
if(choice == cancel_choice)
|
||||
return
|
||||
var/outfit_type = select_loadout()
|
||||
if(!outfit_type || !ispath(outfit_type))
|
||||
return
|
||||
var/delete_items = choice == yes_choice ? TRUE : FALSE
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","EQU")
|
||||
for(var/mob/living/carbon/human/H in player_list)
|
||||
var/datum/outfit/concrete_outfit = new outfit_type
|
||||
concrete_outfit.equip(H, TRUE, strip = delete_items, delete = delete_items)
|
||||
message_admins("[key_name_admin(usr)] has mass equipped a loadout of type [outfit_type] to everyone.")
|
||||
if("retardify")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","RET")
|
||||
@@ -3757,8 +3774,13 @@
|
||||
custom.generate_icon()
|
||||
|
||||
message_admins("[key_name_admin(usr)] has created a custom artifact")
|
||||
|
||||
|
||||
if("naturify")
|
||||
var/choice = input("Are you sure you want to return the station to nature? This will irreversibly break most of the station!") in list("Yeah!", "Cancel")
|
||||
if(choice != "Cancel")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","NA")
|
||||
naturify_station()
|
||||
message_admins("[key_name_admin(usr)] turned the station into wilderness.")
|
||||
if("schoolgirl")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","SG")
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
var/obj/item/device/flashlight/lantern/lantern = null
|
||||
var/start_with_lantern = /obj/item/device/flashlight/lantern/on
|
||||
var/busy = 0
|
||||
var/lantern_can_be_removed = TRUE
|
||||
|
||||
health = 60
|
||||
breakable_flags = BREAKABLE_ALL
|
||||
@@ -55,6 +56,7 @@
|
||||
/obj/structure/hanging_lantern/attack_hand(mob/user)
|
||||
|
||||
if(lantern)
|
||||
if(lantern_can_be_removed)
|
||||
user.visible_message("<span class='notice'>[user] takes \the [lantern] off of the \the [src].</span>", \
|
||||
"<span class='notice'>You take \the [lantern] off of the \the [src].</span>")
|
||||
playsound(src, 'sound/machines/click.ogg', 20, 1)
|
||||
@@ -62,6 +64,8 @@
|
||||
user.put_in_hands(lantern)
|
||||
lantern = null
|
||||
update()
|
||||
else
|
||||
to_chat(user, "The lantern is unable to be removed from its hook!")
|
||||
|
||||
/obj/structure/hanging_lantern/examine(mob/user)
|
||||
..()
|
||||
|
||||
@@ -12,6 +12,15 @@ var/global/list/mineralSpawnChance[]
|
||||
"Diamond" = 1,
|
||||
"Cave" = 1,
|
||||
)
|
||||
mineralSpawnChance["random_safe"] = list(
|
||||
"Iron" = 50,
|
||||
"Plasma" = 25,
|
||||
"Ice" = 10,
|
||||
"Uranium" = 5,
|
||||
"Gold" = 5,
|
||||
"Silver" = 5,
|
||||
"Diamond" = 1,
|
||||
)
|
||||
mineralSpawnChance["snow"] = list(
|
||||
"Nanotrasite" = 24,
|
||||
"Electrum" = 8,
|
||||
@@ -831,6 +840,11 @@ var/list/icon_state_to_appearance = list()
|
||||
|
||||
. = ..()
|
||||
|
||||
/turf/unsimulated/mineral/random/air
|
||||
name = "cave wall"
|
||||
mined_type = /turf/simulated/floor/asteroid/air
|
||||
mineralPool = "random_safe"
|
||||
|
||||
/turf/unsimulated/mineral/random/snow
|
||||
icon_state = "snow_rock"
|
||||
base_icon_state = "snow_rock"
|
||||
|
||||
@@ -137,19 +137,24 @@
|
||||
size = SIZE_BIG
|
||||
holder_type = /obj/item/weapon/holder/animal/cow
|
||||
var/milktype = MILK
|
||||
var/datum/reagents/milkable_reagents
|
||||
var/min_reagent_regen_per_tick = 10
|
||||
var/max_reagent_regen_per_tick = 15
|
||||
var/reagent_regen_chance_per_tick = 25
|
||||
|
||||
/mob/living/simple_animal/cow/splashable()
|
||||
return FALSE
|
||||
|
||||
/mob/living/simple_animal/cow/New()
|
||||
..()
|
||||
reagents.maximum_volume = 150
|
||||
milkable_reagents = new(150)
|
||||
milkable_reagents.my_atom = src
|
||||
|
||||
/mob/living/simple_animal/cow/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(stat == CONSCIOUS && istype(O, /obj/item/weapon/reagent_containers/glass))
|
||||
user.visible_message("<span class='notice'>[user] milks [src] using \the [O].</span>")
|
||||
var/obj/item/weapon/reagent_containers/glass/G = O
|
||||
var/transfered = reagents.trans_id_to(G, milktype, rand(15,25))
|
||||
var/transfered = milkable_reagents.trans_id_to(G, milktype, rand(15,25))
|
||||
if(G.reagents.total_volume >= G.volume)
|
||||
to_chat(user, "<span class='warning'>[O] is full.</span>")
|
||||
if(!transfered)
|
||||
@@ -162,8 +167,8 @@
|
||||
return 0 //under effects of time magick
|
||||
. = ..()
|
||||
if(stat == CONSCIOUS)
|
||||
if(reagents && prob(25))
|
||||
reagents.add_reagent(milktype, rand(10, 15))
|
||||
if(milkable_reagents && prob(reagent_regen_chance_per_tick))
|
||||
milkable_reagents.add_reagent(milktype, rand(min_reagent_regen_per_tick, max_reagent_regen_per_tick))
|
||||
|
||||
/mob/living/simple_animal/cow/attack_hand(mob/living/carbon/M as mob)
|
||||
if(!stat && M.a_intent == I_DISARM && icon_state != icon_dead)
|
||||
|
||||
@@ -208,6 +208,34 @@
|
||||
..(TRUE)
|
||||
qdel(src)
|
||||
|
||||
// Note: these 'friendly' carps behave like retaliate mobs.
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/friendly
|
||||
desc = "A denizen of deep space. This one seems somewhat docile."
|
||||
var/angry = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/friendly/CanAttack(var/atom/the_target)
|
||||
if(angry)
|
||||
return ..()
|
||||
return FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/friendly/adjustBruteLoss(var/damage)
|
||||
..(damage)
|
||||
angry = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/baby/friendly
|
||||
desc = "A baby space carp. This one seems somewhat docile docile."
|
||||
var/angry = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/baby/friendly/CanAttack(var/atom/the_target)
|
||||
if(angry)
|
||||
return ..()
|
||||
return FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/baby/friendly/adjustBruteLoss(var/damage)
|
||||
..(damage)
|
||||
angry = TRUE
|
||||
|
||||
#undef PHEROMONES_NO_EFFECT
|
||||
#undef PHEROMONES_NEUTRAL
|
||||
#undef PHEROMONES_FOLLOW
|
||||
|
||||
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 71 KiB |
BIN
icons/obj/doors/rockdoor.dmi
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 20 KiB |
BIN
icons/obj/flora/trees.dmi
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 76 KiB |
BIN
sound/effects/fishslap.ogg
Normal file
@@ -643,6 +643,7 @@
|
||||
#include "code\game\dna\genes\speech.dm"
|
||||
#include "code\game\dna\genes\vg_disabilities.dm"
|
||||
#include "code\game\dna\genes\vg_powers.dm"
|
||||
#include "code\game\events\naturify.dm"
|
||||
#include "code\game\gamemodes\gameticker.dm"
|
||||
#include "code\game\gamemodes\highscores.dm"
|
||||
#include "code\game\gamemodes\intercept_report.dm"
|
||||
|
||||