Merge branch 'master' into OvermapDynamicPOIs

This commit is contained in:
Nadyr
2023-02-21 20:03:22 -05:00
committed by GitHub
513 changed files with 140099 additions and 259994 deletions

View File

@@ -0,0 +1,5 @@
/proc/coalesce(...)
for (var/arg in args)
if (arg)
return arg
return null

View File

@@ -0,0 +1,95 @@
/datum/component/gargoyle
var/energy = 100
var/transformed = FALSE
var/paused = FALSE
var/paused_loc
var/cooldown
var/mob/living/carbon/human/gargoyle //easy reference
var/obj/structure/gargoyle/statue //another easy ref
/datum/component/gargoyle/Initialize()
if (!ishuman(parent))
return COMPONENT_INCOMPATIBLE
gargoyle = parent
gargoyle.verbs += /mob/living/carbon/human/proc/gargoyle_transformation
gargoyle.verbs += /mob/living/carbon/human/proc/gargoyle_pause
gargoyle.verbs += /mob/living/carbon/human/proc/gargoyle_checkenergy
START_PROCESSING(SSprocessing, src)
/datum/component/gargoyle/process()
if (!gargoyle)
return
if (paused && gargoyle.loc != paused_loc)
unpause()
if (energy > 0)
if (!transformed && !paused)
energy = max(0,energy-0.05)
else if (!transformed && isturf(gargoyle.loc))
gargoyle.gargoyle_transformation()
if (transformed)
if (!statue)
transformed = FALSE
statue.damage(-0.5)
energy = min(energy+0.3, 100)
/datum/component/gargoyle/proc/unpause()
if (!paused || transformed)
paused = FALSE
paused_loc = null
UnregisterSignal(gargoyle, COMSIG_ATOM_ENTERING)
return
if (gargoyle?.loc != paused_loc)
paused = FALSE
paused_loc = null
energy = max(energy - 5, 0)
if (energy == 0)
gargoyle.gargoyle_transformation()
UnregisterSignal(gargoyle, COMSIG_ATOM_ENTERING)
//verbs or action buttons...?
/mob/living/carbon/human/proc/gargoyle_transformation()
set name = "Gargoyle - Petrification"
set category = "Abilities"
set desc = "Turn yourself into (or back from) being a gargoyle."
if (stat == DEAD)
return
var/datum/component/gargoyle/comp = GetComponent(/datum/component/gargoyle)
if (comp)
if (comp.energy <= 0 && isturf(loc))
to_chat(src, "<span class='danger'>You suddenly turn into a statue as you run out of energy!</span>")
else if (comp.cooldown > world.time)
var/time_to_wait = (comp.cooldown - world.time) / (1 SECONDS)
to_chat(src, "<span class='warning'>You can't transform just yet again! Wait for another [round(time_to_wait,0.1)] seconds!</span>")
return
if (istype(loc, /obj/structure/gargoyle))
var/obj/structure/gargoyle/statue = loc
qdel(statue)
else if (isturf(loc))
new /obj/structure/gargoyle(loc, src)
/mob/living/carbon/human/proc/gargoyle_pause()
set name = "Gargoyle - Pause"
set category = "Abilities"
set desc = "Pause your energy while standing still, so you don't use up any more, though you will lose a small amount upon moving again."
if (stat)
return
var/datum/component/gargoyle/comp = GetComponent(/datum/component/gargoyle)
if (comp && !comp.transformed && !comp.paused)
comp.paused = TRUE
comp.paused_loc = loc
comp.RegisterSignal(src, COMSIG_ATOM_ENTERING, /datum/component/gargoyle/proc/unpause)
to_chat(src, "<span class='notice'>You start conserving your energy.</span>")
/mob/living/carbon/human/proc/gargoyle_checkenergy()
set name = "Gargoyle - Check Energy"
set category = "Abilities"
set desc = "Check how much energy you have remaining as a gargoyle."
var/datum/component/gargoyle/comp = GetComponent(/datum/component/gargoyle)
if (comp)
to_chat(src, "<span class='notice'>You have [round(comp.energy,0.01)] energy remaining. It is currently [comp.paused ? "stable" : (comp.transformed ? "increasing" : "decreasing")].</span>")

View File

@@ -0,0 +1,30 @@
/obj/machinery/autolathe/armory
name = "ammolathe"
desc = "An autolathe that produces ammunition using metal and glass."
hacked = 1
/obj/machinery/autolathe/armory/tgui_static_data(mob/user)
var/list/data = ..()
var/list/categories = list()
var/list/recipes = list()
for(var/datum/category_group/autolathe/A in autolathe_recipes.categories)
categories += A.name
for(var/datum/category_item/autolathe/arms/M in A.items)
if(M.hidden && !hacked)
continue
if(M.man_rating > man_rating)
continue
recipes.Add(list(list(
"category" = A.name,
"name" = M.name,
"ref" = REF(M),
"requirements" = M.resources,
"hidden" = M.hidden,
"coeff_applies" = !M.no_scale,
"is_stack" = M.is_stack,
)))
data["recipes"] = recipes
data["categories"] = categories
return data

View File

@@ -0,0 +1,299 @@
// Props
/obj/structure/prop/desert_rock
icon = 'modular_chomp/icons/obj/desert_planet/desert_rocks.dmi'
desc = "Sandy and smooth from erosion."
density = TRUE
anchored = TRUE
/obj/structure/prop/desert_rock/rock
name = "desert rock"
/obj/structure/prop/desert_rock/rock/attack_hand(mob/living/user)
if(user.is_incorporeal())
return
to_chat(user, "You push on the [src].")
var/movedir = user.dir
if(do_after(user, 3 SECONDS, src))
step(src, movedir)
/obj/structure/prop/desert_rock/rock/New()
..()
icon_state = "desert_rock[rand(0,6)]"
/obj/structure/prop/desert_rock/pebble
name = "sandy pebble"
density = FALSE
/obj/structure/prop/desert_rock/pebble/Crossed(atom/movable/AM as mob|obj)
if(AM.is_incorporeal())
return
if(istype(AM, /mob/living))
var/mob/living/M = AM
if(M.m_intent == "run" && prob(5))
M.Weaken(2)
to_chat(M, "You trip over the [src]!")
/obj/structure/prop/desert_rock/pebble/New()
..()
icon_state = "desert_pebble[rand(0,6)]"
/obj/structure/prop/desert_rock/anthill
name = "ant hill"
desc = "See how many ants you can spot."
icon = 'modular_chomp/icons/obj/desert_planet/desert_plants.dmi'
icon_state = "anthill0"
/obj/structure/prop/desert_rock/anthill/New()
..()
icon_state = "anthill[rand(0,2)]"
/obj/structure/prop/desert_planet64x64
name = "large rock"
desc = "Sandy and smooth from erosion."
icon = 'modular_chomp/icons/obj/desert_planet/desert_props_64x64.dmi'
density = TRUE
anchored = TRUE
can_buckle = FALSE
/obj/structure/prop/desert_planet64x64/lrock
icon_state = "lrock"
/obj/structure/prop/desert_planet64x64/lrock1
icon_state = "lrock1"
/obj/structure/prop/desert_planet64x64/lrock2
icon_state = "lrock2"
/obj/structure/prop/desert_planet64x64/lrock3
icon_state = "lrock3"
/obj/structure/prop/desert_planet64x64/lrock4
icon_state = "lrock4"
/obj/structure/prop/desert_planet64x64/lribs
name = "ribs"
desc = "Bleached white by baking sunlight."
icon_state = "lribs"
/obj/structure/prop/desert_planet64x64/lribs1
name = "ribs"
desc = "Bleached white by baking sunlight."
icon_state = "lribs1"
/obj/structure/prop/desert_planet64x64/lskull
name = "skull"
desc = "Bleached white by baking sunlight."
icon_state = "lskull"
/obj/structure/prop/desert_planet64x64/lbone
name = "bone"
desc = "Bleached white by baking sunlight."
icon_state = "lbone"
/obj/structure/prop/desert_planet64x64/palmuria
name = "palm"
desc = "Stout and bushy."
icon_state = "palmuria"
/obj/structure/prop/desert_planet64x64/palmuria1
name = "palm"
desc = "Stout and bushy."
icon_state = "palmuria1"
/obj/structure/prop/desert_planet160x160
name = "desert large boulder"
desc = "Sandy and smooth from erosion."
icon = 'modular_chomp/icons/obj/desert_planet/desert_planet_160x160.dmi'
density = TRUE
anchored = TRUE
can_buckle = FALSE
/obj/structure/prop/desert_planet160x160/largeboulder
icon_state = "large_boulder"
/obj/structure/prop/desert_planet160x160/tallboulder
icon_state = "tall_boulder"
/obj/structure/prop/desert_planet160x160/boulder
icon_state = "boulder"
/obj/structure/prop/desert_planet160x160/lcactus
name = "cactus"
desc = "Large and prickly."
icon_state = "lcactus"
/obj/structure/prop/desert_planet160x160/lcactus1
name = "cactus"
desc = "Large and prickly."
icon_state = "lcactus1"
/obj/structure/prop/desert_planet160x160/lcactus2
name = "cactus"
desc = "Large and prickly."
icon_state = "lcactus2"
/obj/structure/prop/desert_planet160x160/lcactus3
name = "cactus"
desc = "Large and prickly."
icon_state = "lcactus3"
// Flora
/obj/structure/flora/desert_planet
name = "desert plant"
desc = "Probably a succulent."
icon = 'modular_chomp/icons/obj/desert_planet/desert_plants.dmi'
/obj/structure/flora/desert_planet/potted_plant
name = "potted plant"
desc = "Colloquially known as a pot plant."
icon_state = "potplant0"
/obj/structure/flora/desert_planet/potted_plant/New()
..()
icon_state = "potplant[rand(0,2)]"
/obj/structure/flora/desert_planet/thicket
name = "thicket"
desc = "Weedy growths."
icon_state = "thicket0"
/obj/structure/flora/desert_planet/thicket/New()
..()
icon_state = "thicket[rand(0,6)]"
/obj/structure/flora/desert_planet/shrub
name = "shrub"
desc = "Dense and weedy."
icon_state = "shrub0"
/obj/structure/flora/desert_planet/shrub/New()
..()
icon_state = "shrub[rand(0,5)]"
/obj/structure/flora/desert_planet/bush
name = "bush"
desc = "Denser and weedier."
icon_state = "bush0"
/obj/structure/flora/desert_planet/bush/New()
..()
icon_state = "bush[rand(0,5)]"
/obj/structure/flora/desert_planet/barrelcacti
name = "barrel cacti"
desc = "Small, adorable, and begging for a hug."
icon_state = "barrelcacti0"
/obj/structure/flora/desert_planet/barrelcacti/New()
..()
icon_state = "barrelcacti[rand(0,3)]"
/obj/structure/flora/desert_planet/palmy
name = "yucca bush"
desc = "Probably not actually a yucca."
icon_state = "palmy0"
/obj/structure/flora/desert_planet/palmy/New()
..()
icon_state = "palmy[rand(0,2)]"
/obj/structure/flora/desert_planet/shrubber
name = "thorny bush"
desc = "Makes for great fur accessories."
icon_state = "shrubber0"
/obj/structure/flora/desert_planet/shrubber/New()
..()
icon_state = "shrubber[rand(0,2)]"
/obj/structure/flora/desert_planet/lbarrelcacti
name = "barrel cactus"
desc = "Absolutely begging for pets."
icon_state = "lbarrelcacti0"
/obj/structure/flora/desert_planet/lbarrelcacti/New()
..()
icon_state = "lbarrelcacti[rand(0,2)]"
// Trees
/obj/structure/flora/tree/desert_planet
name = "palm tree"
desc = "Tall palm tree, makes for a good shade."
icon = 'modular_chomp/icons/obj/desert_planet/desert_planet_160x160.dmi'
density = FALSE
anchored = TRUE
can_buckle = FALSE
product = /obj/item/stack/material/log
product_amount = 50
health = 2000
max_health = 2000
//var/fruit
/obj/structure/flora/tree/desert_planet/palmtreeb
icon_state = "palmtreeb"
base_state = "palmr" // Necessary for stumps to work.
/obj/structure/flora/tree/desert_planet/palmtreeb1
icon_state = "palmtreeb1"
base_state = "palml"
/obj/structure/flora/tree/desert_planet/palmtree
icon_state = "palmtree"
base_state = "palmr"
/obj/structure/flora/tree/desert_planet/palmtree1
icon_state = "palmtree1"
base_state = "palml"
/obj/structure/flora/tree/desert_planet/mpalmtreeb
icon_state = "mpalmtreeb"
base_state = "palmr"
/obj/structure/flora/tree/desert_planet/mpalmtreeb1
icon_state = "mpalmtreeb1"
base_state = "palml"
/obj/structure/flora/tree/desert_planet/mpalmtree
icon_state = "mpalmtree"
base_state = "palml"
/obj/structure/flora/tree/desert_planet/mpalmtree1
icon_state = "mpalmtree1"
base_state = "palmr"
/obj/structure/flora/tree/desert_planet/spalmtree
icon_state = "spalmtree"
base_state = "palmls"
/obj/structure/flora/tree/desert_planet/spalmtree1
icon_state = "spalmtree1"
base_state = "palmrs"
/obj/structure/flora/tree/desert_planet/spalmtree3
icon_state = "spalmtree3"
base_state = "palmls"
/obj/structure/flora/tree/desert_planet/spalmtree4
icon_state = "spalmtree4"
base_state = "palmrs"
/obj/structure/flora/tree/desert_planet/desert_tree
name = "barren tree"
desc = "Completely barren."
icon_state = "desert_tree"
base_state = "desert"
/obj/structure/flora/tree/desert_planet/desert_tree1
name = "gnarled tree"
desc = "Twisted but living."
icon_state = "desert_tree1"
base_state = "desert"
/obj/structure/flora/tree/desert_planet/desert_tree3
name = "hardy tree"
desc = "Thriving despite the conditions."
icon_state = "desert_tree3"
base_state = "desert"
product_amount = 100
health = 4000
max_health = 4000

View File

@@ -0,0 +1,169 @@
/obj/structure/gargoyle
name = "statue"
desc = "A very lifelike carving."
density = TRUE
anchored = TRUE
var/mob/living/carbon/human/gargoyle
var/initial_sleep
var/initial_blind
var/initial_is_shifted
var/initial_lying
var/initial_lying_prev
var/wagging
var/flapping
var/obj_integrity = 100
var/original_int = 100
var/max_integrity = 100
var/stored_examine
/obj/structure/gargoyle/Initialize(mapload, var/mob/living/carbon/human/H)
. = ..()
if (isspace(loc) || isopenspace(loc))
anchored = FALSE
if (!istype(H) || !isturf(H.loc))
return
var/datum/component/gargoyle/comp = H.GetComponent(/datum/component/gargoyle)
if (comp)
comp.cooldown = world.time + (15 SECONDS)
comp.statue = src
comp.transformed = TRUE
comp.paused = FALSE
gargoyle = H
max_integrity = H.getMaxHealth() + 100
obj_integrity = H.health + 100
original_int = obj_integrity
name = "statue of [H.name]"
desc = "A very lifelike statue."
stored_examine = H.examine()
description_fluff = H.get_description_fluff()
if (H.buckled)
H.buckled.unbuckle_mob(H, TRUE)
icon = H.icon
copy_overlays(H)
color = list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
initial_sleep = H.sleeping
initial_blind = H.eye_blind
initial_is_shifted = H.is_shifted
transform = H.transform
layer = H.layer
pixel_x = H.pixel_x
pixel_y = H.pixel_y
dir = H.dir
initial_lying = H.lying
initial_lying_prev = H.lying_prev
H.sdisabilities |= MUTE
if (H.appearance_flags & PIXEL_SCALE)
appearance_flags |= PIXEL_SCALE
wagging = H.wagging
H.transforming = TRUE
flapping = H.flapping
H.toggle_tail(FALSE, FALSE)
H.toggle_wing(FALSE, FALSE)
H.visible_message("<span class='warning'>[H]'s skin rapidly turns to stone!</span>", "<span class='warning'>Your skin abruptly hardens as you turn to stone!</span>")
H.forceMove(src)
H.SetBlinded(0)
H.SetSleeping(0)
H.status_flags |= GODMODE
H.updatehealth()
H.canmove = 0
/obj/structure/gargoyle/Destroy()
unpetrify()
. = ..()
/obj/structure/gargoyle/examine_icon()
var/icon/examine_icon = ..()
examine_icon.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
return examine_icon
/obj/structure/gargoyle/get_description_info()
if (gargoyle)
if (isspace(loc) || isopenspace(loc))
return
return "It can be [anchored ? "un" : ""]anchored with a wrench."
/obj/structure/gargoyle/examine(mob/user)
. = ..()
if (gargoyle && stored_examine)
. += "The statue seems to have a bit more to them..."
. += stored_examine
return
/obj/structure/gargoyle/proc/unpetrify()
if (!gargoyle)
return
var/datum/component/gargoyle/comp = gargoyle.GetComponent(/datum/component/gargoyle)
if (comp)
comp.cooldown = world.time + (15 SECONDS)
comp.statue = null
comp.transformed = FALSE
gargoyle.forceMove(loc)
gargoyle.transform = transform
gargoyle.pixel_x = pixel_x
gargoyle.pixel_y = pixel_y
gargoyle.is_shifted = initial_is_shifted
gargoyle.dir = dir
gargoyle.lying = initial_lying
gargoyle.lying_prev = initial_lying_prev
gargoyle.toggle_tail(wagging, FALSE)
gargoyle.toggle_wing(flapping, FALSE)
gargoyle.sdisabilities &= ~MUTE //why is there no ADD_TRAIT etc here that's actually ussssed
gargoyle.status_flags &= ~GODMODE
gargoyle.SetBlinded(initial_blind)
gargoyle.SetSleeping(initial_sleep)
gargoyle.transforming = FALSE
gargoyle.canmove = 1
gargoyle.update_canmove()
var/hurtmessage = ""
if (obj_integrity < original_int)
var/f = (original_int - obj_integrity) / 10
for (var/x in 1 to 10)
gargoyle.adjustBruteLoss(f)
hurtmessage = " <b>You feel your body take the damage that was dealt while being stone!</b>"
gargoyle.updatehealth()
alpha = 0
gargoyle.visible_message("<span class='warning'>[gargoyle]'s skin rapidly softens, returning them to normal!</span>", "<span class='warning'>Your skin softens, freeing your movement once more![hurtmessage]</span>")
/obj/structure/gargoyle/return_air()
return return_air_for_internal_lifeform()
/obj/structure/gargoyle/return_air_for_internal_lifeform(var/mob/living/lifeform)
var/air_type = /datum/gas_mixture/belly_air
if(istype(lifeform))
air_type = lifeform.get_perfect_belly_air_type()
var/air = new air_type(1000)
return air
/obj/structure/gargoyle/proc/damage(var/damage)
obj_integrity = min(obj_integrity-damage, max_integrity)
if(obj_integrity <= 0)
qdel(src)
/obj/structure/gargoyle/take_damage(var/damage)
damage(damage)
/obj/structure/gargoyle/attack_generic(var/mob/user, var/damage, var/attack_message = "hits")
user.do_attack_animation(src)
visible_message("<span class='danger'>[user] [attack_message] the [src]!</span>")
damage(damage)
/obj/structure/gargoyle/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if(W.is_wrench())
if (isspace(loc) || isopenspace(loc))
to_chat(user, "<span class='warning'>You can't anchor that here!</span>")
anchored = FALSE
return ..()
playsound(src, W.usesound, 50, 1)
if (do_after(user, (2 SECONDS) * W.toolspeed, target = src))
to_chat("<span class='notice'>You [anchored ? "un" : ""]anchor the [src].</span>")
anchored = !anchored
else if (!(W.flags & NOBLUDGEON))
user.setClickCooldown(user.get_attack_speed(W))
if(W.damtype == BRUTE || W.damtype == BURN)
user.do_attack_animation(src)
playsound(src, W.hitsound, 50, 1)
damage(W.force)
else
return ..()

View File

@@ -1,136 +1,257 @@
/* Testing
// Parent turf.
/turf/simulated/floor/outdoors/desert_planet
name = "sand"
desc = "Salty and gritty."
icon = 'modular_chomp/icons/turf/desert_tiles.dmi'
icon_edge = 'modular_chomp/icons/turf/outdoors_edge.dmi'
can_dig = FALSE
/turf/simulated/floor/outdoors/desert_planet/sand
name = "sand"
desc = "Sandy, taste salty and gritty."
icon = 'modular_chomp/icons/turf/desert_planet.dmi'
desc = "Salty and gritty."
icon_state = "sand0"
edge_blending_priority = 2
turf_layers = list(/turf/simulated/floor/outdoors/rocks)
initial_flooring = /decl/flooring/sand
can_dig = false
*/
initial_flooring = /decl/flooring/desert_planet/sand
/turf/simulated/floor/outdoors/desert_planet/sand
name = "sand"
desc = "Salty and gritty."
icon = 'modular_chomp/icons/turf/desert_planet.dmi'
icon_state = "sand"
edge_blending_priority = 3
turf_layers = list(/turf/simulated/floor/outdoors/desert_planet/sand)
// Necessary to get the edges to generate correctly since we use a random-ish icon_state. Inelegant to hard code, but this is a one-off case.
/turf/simulated/floor/outdoors/desert_planet/sand/get_edge_icon_state()
return "sand"
/* Testing
/decl/flooring/outdoors/sand
name = "sand"
desc = "Salty and gritty."
icon = 'modular_chomp/icons/turf/desert_planet.dmi'
icon_base = "sand"
footstep_sounds = list("human" = list(
'sound/effects/footstep/asteroid1.ogg',
'sound/effects/footstep/asteroid2.ogg',
'sound/effects/footstep/asteroid3.ogg',
'sound/effects/footstep/asteroid4.ogg',
'sound/effects/footstep/asteroid5.ogg',
'sound/effects/footstep/MedDirt1.ogg',
'sound/effects/footstep/MedDirt2.ogg',
'sound/effects/footstep/MedDirt3.ogg',
'sound/effects/footstep/MedDirt4.ogg'))
/turf/simulated/floor/outdoors/desert_planet/sand/Initialize(mapload)
. = ..()
icon_state = "sand[rand(0,2)]"
/turf/simulated/floor/outdoors/sand/Initialize(mapload)
var/possiblesands = list(
"ironsand1" = 50,
"ironsand2" = 1,
"ironsand3" = 1,
"ironsand4" = 1,
"ironsand5" = 1,
"ironsand6" = 1,
"ironsand7" = 1,
"ironsand8" = 1,
"ironsand9" = 1,
"ironsand10" = 1,
"ironsand11" = 1,
"ironsand12" = 1,
"ironsand13" = 1,
"ironsand14" = 1,
"ironsand15" = 1
)
flooring_override = pickweight(possiblesands)
return ..()
/turf/simulated/floor/water/hotspring
name = "Hotsprings"
desc = "A natural hotspring connecting to an aquifer. It seems the facility was built ontop of it."
edge_blending_priority = -2
movement_cost = 8
depth = 2
water_state = "water_shallow"
outdoors = FALSE
/turf/simulated/floor/water/hotspring/Entered(atom/movable/AM, atom/oldloc)
if(istype(AM, /mob/living))
var/mob/living/L = AM
L.update_water()
if(L.check_submerged() <= 0)
return
if(!istype(oldloc, /turf/simulated/floor/water/hotspring))
to_chat(L, "<span class='warning'>You feel an overwhelming wave of warmth from entering \the [src]!</span>")
AM.water_act(5)
..()
*/
/turf/simulated/floor/outdoors/desert_planet/sand/attackby(var/obj/item/W, var/mob/user)
if(istype(W, /obj/item/weapon/shovel))
to_chat(user, "<span class='notice'>You begin to remove \the [src] with your [W].</span>")
if(do_after(user, 4 SECONDS * W.toolspeed))
to_chat(user, "<span class='notice'>\The [src] has been dug up, and now lies in a pile nearby.</span>")
icon_state = "sand_dug"
new /obj/item/weapon/ore/glass (src)
else
to_chat(user, "<span class='notice'>You decide to not finish removing \the [src].</span>")
else
..()
/turf/simulated/floor/outdoors/desert_planet/deep_sand
name = "sand"
desc = "Salty and gritty."
icon = 'modular_chomp/icons/turf/desert_planet.dmi'
icon_state = "deep_sand"
edge_blending_priority = 2
turf_layers = list(/turf/simulated/floor/outdoors/desert_planet/sand)
desc = "Really gets everywhere."
icon_state = "deep_sand0"
edge_blending_priority = 1
movement_cost = 3
initial_flooring = /decl/flooring/desert_planet/deep_sand
/turf/simulated/floor/outdoors/desert_planet/deep_sand/Initialize(mapload)
. = ..()
icon_state = "deep_sand[rand(0,2)]"
/turf/simulated/floor/outdoors/desert_planet/grass
name = "grass"
desc = "Lively green grass, soft to walk on."
icon = 'modular_chomp/icons/turf/desert_planet.dmi'
icon_state = "grass"
edge_blending_priority = 6
turf_layers = list(/turf/simulated/floor/outdoors/desert_planet/sand)
edge_blending_priority = 5
initial_flooring = /decl/flooring/desert_planet/grass
/turf/simulated/floor/outdoors/desert_planet/deep_grass
name = "dense grass"
desc = "Dense patch of grass, seems like a soft spot to lay on."
icon = 'modular_chomp/icons/turf/desert_planet.dmi'
icon_state = "deep_grass"
edge_blending_priority = 7
turf_layers = list(/turf/simulated/floor/outdoors/desert_planet/sand)
edge_blending_priority = 6
initial_flooring = /decl/flooring/desert_planet/deep_grass
/turf/simulated/floor/outdoors/desert_planet/gravel
name = "gravel"
desc = "Mix of dirt and sand, it crumbles in your hand."
icon = 'modular_chomp/icons/turf/desert_planet.dmi'
icon_state = "gravel"
edge_blending_priority = 5
turf_layers = list(/turf/simulated/floor/outdoors/desert_planet/sand)
edge_blending_priority = 3
initial_flooring = /decl/flooring/desert_planet/gravel
/turf/simulated/floor/outdoors/desert_planet/mud
name = "mud"
desc = "Squishy damp dirt, smells muddy."
icon = 'modular_chomp/icons/turf/desert_planet.dmi'
icon_state = "mud"
edge_blending_priority = 4
turf_layers = list(/turf/simulated/floor/outdoors/desert_planet/sand)
initial_flooring = /decl/flooring/desert_planet/mud
// At last we've come full circle, a floor which is actually a wall.
/turf/simulated/floor/outdoors/desert_planet/stonewall
name = "sandstone"
desc = "Rough sandstone."
icon_state = "stonewall"
density = TRUE
opacity = TRUE
edge_blending_priority = 7
initial_flooring = /decl/flooring/desert_planet/stonewall
turf_layers = list(/turf/simulated/floor/outdoors/rocks)
var/last_act = 0
// Stolen from mineral turf code.
/turf/simulated/floor/outdoors/desert_planet/stonewall/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(!user.IsAdvancedToolUser())
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
return
if(istype(W, /obj/item/weapon/pickaxe))
if(!istype(user.loc, /turf))
return
var/obj/item/weapon/pickaxe/P = W
if(last_act + P.digspeed > world.time)//prevents message spam
return
last_act = world.time
playsound(user, P.drill_sound, 20, 1)
to_chat(user, "<span class='notice'>You start [P.drill_verb].</span>")
if(do_after(user,P.digspeed))
to_chat(user, "<span class='notice'>You finish [P.drill_verb] \the [src].</span>")
new /obj/item/stack/material/sandstone(src)
density = FALSE
opacity = FALSE
demote() // Converts the turf to the next layer in turf_layers.
..()
/turf/simulated/floor/outdoors/desert_planet/sandrock
name = "sandstone tiles"
desc = "Tightly joined in a mesmerizing lattice."
icon_state = "sandrock"
density = TRUE
opacity = TRUE
initial_flooring = /decl/flooring/desert_planet/sandrock
// Declarations (for initial_flooring)
/decl/flooring/desert_planet // Yeah don't use this one, it's a parent just for setting icon.
name = "desert stuff"
desc = "If you see this, this turf is using the wrong decl."
icon = 'modular_chomp/icons/turf/desert_tiles.dmi'
icon_base = null
/decl/flooring/desert_planet/sand
name = "sand"
desc = "Salty and gritty."
icon_base = "sand"
has_base_range = 2
/decl/flooring/desert_planet/deep_sand
name = "sand"
desc = "Really gets everywhere."
icon_base = "deep_sand"
has_base_range = 2
/decl/flooring/desert_planet/grass
name = "grass"
desc = "Lively green grass, soft to walk on."
icon_base = "grass"
/decl/flooring/desert_planet/deep_grass
name = "dense grass"
desc = "Dense patch of grass, seems like a soft spot to lay on."
icon_base = "deep_grass"
/decl/flooring/desert_planet/gravel
name = "gravel"
desc = "Mix of dirt and sand, it crumbles in your hand."
icon_base = "gravel"
/decl/flooring/desert_planet/mud
name = "mud"
desc = "Squishy damp dirt, smells muddy."
icon_base = "mud"
/decl/flooring/desert_planet/stonewall
name = "sandstone"
desc = "Rough sandstone."
icon_base = "stonewall"
/decl/flooring/desert_planet/sandrock
name = "sandstone tiles"
desc = "Tightly joined in a mesmerizing lattice."
icon_base = "sandrock"
flags = TURF_HAS_EDGES | TURF_HAS_CORNERS
/*
/obj/effect/floor_decal/desert_planet/floor/sand0_edge
name = "sand0_edge"
icon = 'icons/turf/desert_planet.dmi'
icon_state = "sand0_edge"
/obj/effect/floor_decal/desert_planet/floor/gravel_edge
name = "gravel_edge"
icon = 'icons/turf/desert_planet.dmi'
icon_state = "gravel_edge"
/obj/effect/floor_decal/desert_planet/floor/mud_edge
name = "mud_edge"
icon = 'icons/turf/desert_planet.dmi'
icon_state = "mud_edge"
/obj/effect/floor_decal/desert_planet/floor/grass_edge
name = "grass_edge"
icon = 'icons/turf/desert_planet.dmi'
icon_state = "grass_edge"
/obj/effect/floor_decal/desert_planet/floor/deep_grass_edge
name = "deep_grass_edge"
icon = 'icons/turf/desert_planet.dmi'
icon_state = "deep_grass_edge"
*/
/* #No idea how water tiles work
/turf/simulated/floor/outdoors/desert_planet/water
name = "water"
desc = "Clear cool water, looks potable."
icon = 'modular_chomp/icons/turf/desert_planet.dmi'
icon = 'icons/turf/desert_planet.dmi'
icon_state = "water"
edge_blending_priority = 8
var/water_state = "water_shallow"
var/under_state = "sand"
can_be_plated = FALSE
outdoors = OUTDOORS_YES
flags = TURF_ACID_IMMUNE
layer = WATER_FLOOR_LAYER
can_dirty = FALSE // It's water
var/depth = 1 // Higher numbers indicates deeper water.
var/reagent_type = "water"
edge_blending_priority = 2
turf_layers = list(/turf/simulated/floor/outdoors/desert_planet/sand)
/turf/simulated/floor/outdoors/desert_planet/deep_water
name = "deep water"
desc = "deep enough you can't see the bottom of it."
icon = 'modular_chomp/icons/turf/desert_planet.dmi'
icon = 'icons/turf/desert_planet.dmi'
icon_state = "deep_water"
edge_blending_priority = 9
var/water_state = "water_shallow"
var/under_state = "sand"
can_be_plated = FALSE
outdoors = OUTDOORS_YES
flags = TURF_ACID_IMMUNE
layer = WATER_FLOOR_LAYER
can_dirty = FALSE // It's water
var/depth = 2 // Higher numbers indicates deeper water.
var/reagent_type = "water"
edge_blending_priority = 4
turf_layers = list(/turf/simulated/floor/outdoors/desert_planet/sand)
//I want this for the water tiles
/turf/simulated/floor/water
name = "shallow water"
desc = "A body of water. It seems shallow enough to walk through, if needed."
icon = 'icons/turf/outdoors.dmi'
icon_state = "seashallow" // So it shows up in the map editor as water.
var/water_state = "water_shallow"
var/under_state = "rock"
edge_blending_priority = -1
movement_cost = 4
can_be_plated = FALSE
outdoors = OUTDOORS_YES
flags = TURF_ACID_IMMUNE
layer = WATER_FLOOR_LAYER
can_dirty = FALSE // It's water
var/depth = 1 // Higher numbers indicates deeper water.
var/reagent_type = "water"
// var/datum/looping_sound/water/soundloop CHOMPEdit: Removing soundloop for now.
*/

View File

@@ -0,0 +1,25 @@
/obj/item/weapon/deadringer/process()
if(activated)
if (ismob(src.loc))
var/mob/living/carbon/human/H = src.loc
watchowner = H
if(H.getBruteLoss() > bruteloss_prev || H.getFireLoss() > fireloss_prev)
deathprevent()
activated = 0
if(watchowner.isSynthetic())
to_chat(watchowner, "<font color='blue'>You fade into nothingness! [src]'s screen blinks, being unable to copy your synthetic body!</font>")
else
to_chat(watchowner, "<font color='blue'>You fade into nothingness, leaving behind a fake body!</font>")
icon_state = "deadringer_cd"
timer = 5
return
if(timer > 0)
timer--
if(timer == 2)
reveal()
if(corpse)
new /obj/effect/effect/smoke/chem(corpse.loc)
qdel(corpse)
if(timer == 0)
icon_state = "deadringer"
return

View File

@@ -0,0 +1,6 @@
/obj/item/clothing/shoes/apply_blood(var/image/standing)
if(blood_DNA && blood_sprite_state && ishuman(loc))
var/mob/living/carbon/human/H = loc
var/image/bloodsies = image(icon = H.digitigrade ? 'modular_chomp/icons/mob/human_races/masks/blood_digitigrade.dmi' : H.species.get_blood_mask(H), icon_state = blood_sprite_state)
bloodsies.color = blood_color
standing.add_overlay(bloodsies)

View File

@@ -0,0 +1,71 @@
/obj/item/weapon/rig/ch/precursor
name = "xenotech hardsuit control module"
desc = "A purple hardsuit gleaming with energy and alien metals."
suit_type = "precursor hardsuit"
icon = 'modular_chomp/icons/obj/rig_modules_ch.dmi'
icon_state = "precursor_rig"
armor = list(melee = 50, bullet = 50, laser = 70, energy = 70, bomb = 60, bio = 100, rad = 80)
var/block_chance = 15
slowdown = 0
chest_type = /obj/item/clothing/suit/space/rig/ch/precursor
helm_type = /obj/item/clothing/head/helmet/space/rig/ch/precursor
glove_type = /obj/item/clothing/gloves/gauntlets/rig/ch/precursor
boot_type = /obj/item/clothing/shoes/magboots/rig/ch/precursor
req_access = list()
req_one_access = list()
/obj/item/clothing/suit/space/rig/ch/precursor
name = "protective vest"
icon = 'icons/obj/clothing/spacesuits_ch.dmi'
desc = "Light weight but oddly protective plating."
var/block_chance = 15
/obj/item/clothing/head/helmet/space/rig/ch/precursor
name = "helmet"
icon = 'icons/obj/clothing/hats_ch.dmi'
desc = "A protective dome for your head."
var/block_chance = 15
/obj/item/clothing/gloves/gauntlets/rig/ch/precursor
name = "gloves"
icon = 'icons/obj/clothing/gloves_ch.dmi'
desc = "Gloves created with alien tech"
var/block_chance = 15
/obj/item/clothing/shoes/magboots/rig/ch/precursor
name = "boots"
icon = 'icons/obj/clothing/shoes_ch.dmi'
desc = "A pair of grabby boots"
var/block_chance = 15
/obj/item/weapon/rig/ch/precursor/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(prob(block_chance))
user.visible_message("<span class='danger'>\The [src] completely absorbs [attack_text]!</span>")
return TRUE
return FALSE
/obj/item/clothing/suit/space/rig/ch/precursor/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(prob(block_chance))
user.visible_message("<span class='danger'>\The [src] completely absorbs [attack_text]!</span>")
return TRUE
return FALSE
/obj/item/clothing/head/helmet/space/rig/ch/precursor/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(prob(block_chance))
user.visible_message("<span class='danger'>\The [src] completely absorbs [attack_text]!</span>")
return TRUE
return FALSE
/obj/item/clothing/gloves/gauntlets/rig/ch/precursor/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(prob(block_chance))
user.visible_message("<span class='danger'>\The [src] completely absorbs [attack_text]!</span>")
return TRUE
return FALSE
/obj/item/clothing/shoes/magboots/rig/ch/precursor/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(prob(block_chance))
user.visible_message("<span class='danger'>\The [src] completely absorbs [attack_text]!</span>")
return TRUE
return FALSE

View File

@@ -1,3 +1,4 @@
/obj/item/weapon/rig
var/protean = 0
var/obj/item/weapon/storage/backpack/rig_storage
var/obj/item/weapon/storage/backpack/rig_storage
permeability_coefficient = 0 //Protect the squishies, after all this shit should be waterproof.

View File

@@ -0,0 +1,23 @@
/obj/machinery/cash_register/medical
req_access = list()
req_one_access = list(access_medical,access_heads)
/obj/machinery/cash_register/engineering
req_access = list()
req_one_access = list(access_engine_equip,access_heads)
/obj/machinery/cash_register/science
req_access = list()
req_one_access = list(access_tox,access_heads)
/obj/machinery/cash_register/security
req_access = list()
req_one_access = list(access_brig,access_heads)
/obj/machinery/cash_register/cargo
req_access = list()
req_one_access = list(access_cargo,access_heads)
/obj/machinery/cash_register/civilian
req_access = list()
req_one_access = list(access_kitchen,access_bar,access_hydroponics,access_heads)

View File

@@ -13,3 +13,6 @@
var/hide_glasses = FALSE
var/speech_sound_enabled = TRUE
var/nutrition_hidden = FALSE
/mob/living/carbon/human/ai_controlled
low_priority = TRUE

View File

@@ -1,4 +1,7 @@
/datum/species/vox
icobase = 'icons/mob/human_races/r_vox_ch.dmi'
tail = "voxtail"
tail_animation = 'icons/mob/species/vox/tail.dmi'
speech_chance = 50 // As long as we're making the option to disable it, might as well bump up the chances when it is enabled
inherent_verbs = list(
/mob/living/carbon/human/proc/toggle_speech_sounds

View File

@@ -0,0 +1,4 @@
/mob/living/simple_mob/slime/promethean/character_directory_species()
if (humanform)
return "[humanform.custom_species ? humanform.custom_species : (humanform.species ? humanform.species.name : "Promethean Blob")]"
return "Promethean Blob"

View File

@@ -380,6 +380,11 @@
return
..()
/mob/living/simple_mob/protean_blob/character_directory_species()
if (humanform)
return "[humanform.custom_species ? humanform.custom_species : (humanform.species ? humanform.species.name : "Protean")]"
return "Protean"
var/global/list/disallowed_protean_accessories = list(
/obj/item/clothing/accessory/holster,
/obj/item/clothing/accessory/storage,

View File

@@ -25,7 +25,8 @@
if(!istype(refactory))
to_chat(caller,"<span class='warning'>You don't have a working refactory module!</span>")
return
var/choice = tgui_input_list(caller,"Pick the bodypart to change:", "Refactor - One Bodypart", species.has_limbs)
var/choice = tgui_input_list(src,"Pick the bodypart to change:", "Refactor - One Bodypart", species.has_limbs)
if(!choice)
return
@@ -66,7 +67,7 @@
var/datum/robolimb/M = chargen_robolimbs[company]
if(!(choice in M.parts))
continue
if(impersonate_bodytype in M.species_cannot_use)
if(species?.base_species in M.species_cannot_use)
continue
if(M.whitelisted_to && !(ckey in M.whitelisted_to))
continue
@@ -127,7 +128,7 @@
var/datum/robolimb/M = chargen_robolimbs[company]
if(!(BP_TORSO in M.parts))
continue
if(impersonate_bodytype in M.species_cannot_use)
if(species?.base_species in M.species_cannot_use)
continue
if(M.whitelisted_to && !(ckey in M.whitelisted_to))
continue
@@ -283,7 +284,6 @@
var/new_species = tgui_input_list(usr, "Please select a species to emulate.", "Shapeshifter Body", GLOB.playable_species)
if(new_species)
impersonate_bodytype = new_species
species?.base_species = new_species // Really though you better have a species
regenerate_icons() //Expensive, but we need to recrunch all the icons we're wearing

View File

@@ -10,6 +10,9 @@
knockout_message = "collapses inwards, forming a disordered puddle of gray goo."
remains_type = /obj/effect/decal/cleanable/ash
selects_bodytype = SELECTS_BODYTYPE_SHAPESHIFTER
base_species = SPECIES_HUMAN
blood_color = "#505050" //This is the same as the 80,80,80 below, but in hex
flesh_color = "#505050"
base_color = "#FFFFFF" //Color mult, start out with this
@@ -126,9 +129,12 @@
saved_nif.quick_implant(H)
/datum/species/protean/get_bodytype(var/mob/living/carbon/human/H)
if(H)
return H.impersonate_bodytype || ..()
return ..()
if(!H || base_species == name) return ..()
var/datum/species/S = GLOB.all_species[base_species]
return S.get_bodytype(H)
/datum/species/protean/get_valid_shapeshifter_forms(var/mob/living/carbon/human/H)
return GLOB.playable_species
/datum/species/protean/handle_post_spawn(var/mob/living/carbon/human/H)
..()

View File

@@ -44,6 +44,9 @@
/datum/species/custom
digi_allowed = TRUE
/datum/species/shapeshifter/promethean
digi_allowed = TRUE
/datum/species/unathi
digi_allowed = TRUE
vore_belly_default_variant = "L"
@@ -72,3 +75,6 @@
/datum/species/xenochimera
digi_allowed = TRUE
/datum/species/protean
digi_allowed = TRUE

View File

@@ -9,8 +9,8 @@
var/mob/living/carbon/human/DraggedH = src
//make sure src (the dragged) is a teshari
if(DraggedH.species.name == SPECIES_TESHARI)
//make sure src (the dragged) is a teshari (or shaped like one)
if(DraggedH.species.get_bodytype() == SPECIES_TESHARI)
var/mob/living/M = over_object
// only perform the grab if; grabber and grabbed adjacent, caller is grabbed OR grabber, and the grabbed's grab preference is true.
if(holder_type && istype(M) && Adjacent(M) && (usr == M || usr == DraggedH) && DraggedH != M && !M.incapacitated() && DraggedH.pickup_pref && (M != usr || (M == usr && M.pickup_active)) && (DraggedH.a_intent == I_HELP && M.a_intent == I_HELP)) //VOREStation Edit
@@ -23,7 +23,7 @@
/obj/structure/plasticflaps/CanPass(atom/A, turf/T)
var/mob/living/carbon/human/H = A
if(istype(H))
if(H.species.name == SPECIES_TESHARI)
if(H.species.get_bodytype() == SPECIES_TESHARI)
return 1
return ..()

View File

@@ -3,3 +3,6 @@
/datum/trait/positive/linguist
custom_only = FALSE
/datum/trait/positive/toxin_gut
custom_only = FALSE

View File

@@ -16,7 +16,7 @@
for(var/f in list(BP_L_FOOT, BP_R_FOOT))
var/obj/item/organ/external/foot/foot = get_organ(f)
if(istype(foot) && foot.is_hidden_by_tail()) //If either foot is hidden by the tail, don't render footwear.
if(istype(foot) && foot.is_hidden_by_sprite_accessory()) //If either foot is hidden by the tail, don't render footwear.
return
var/obj/item/clothing/shoes/shoe = shoes
@@ -107,4 +107,4 @@
/mob/living/carbon/human/update_tail_showing()
. = ..()
update_vore_tail_sprite()
update_vore_tail_sprite()

View File

@@ -104,3 +104,6 @@
var/vs_fullness = vore_fullness_ex[belly_class]
if(vs_fullness > 0)
add_overlay("[icon_state]_[belly_class]-[vs_fullness]")
/mob/living/simple_mob/proc/character_directory_species()
return "simplemob"

View File

@@ -0,0 +1,45 @@
/mob/living/simple_mob/humanoid/cultist/human/bloodjaunt/fireball //Teleporting Cultists, now with fireballs
name = "Burning Mage"
desc = "An indiuval wrapped up in red robes, with orange highlights, their paws glowing.."
icon_state = "fire-fluff"
icon_living = "fire-fluff"
special_attack_min_range = 4
special_attack_max_range = 7
special_attack_cooldown = 10 SECONDS
harm_intent_damage = 5
melee_damage_lower = 5
melee_damage_upper = 10
ai_holder_type = /datum/ai_holder/simple_mob/ranged
projectiletype = /obj/item/projectile/energy/fireball
/mob/living/simple_mob/humanoid/cultist/noodle
name = "Converted"
desc = "An indiuval wrapped up in a makeshift rig, made from fallen cultist."
icon_state = "cobra-cultist"
icon_living = "cobra-cultist"
maxHealth = 150
health = 150
faction = "cult"
status_flags = 0
response_help = "pokes"
response_disarm = "shoves"
response_harm = "hits"
harm_intent_damage = 5
melee_damage_lower = 15
melee_damage_upper = 25
attack_sharp = 1
attack_edge = 1
attacktext = list("slashed", "stabbed")
armor = list(melee = 60, bullet = 40, laser = 60, energy = 80, bomb = 25, bio = 100, rad = 100)
attack_sound = 'sound/weapons/rapidslice.ogg'
movement_cooldown = 4
projectiletype = /obj/item/projectile/energy/plasma/vepr
projectilesound = 'sound/weapons/spiderlunge.ogg'
movement_cooldown = 2
ai_holder_type = /datum/ai_holder/simple_mob/ranged

View File

@@ -0,0 +1,52 @@
//This hivebots are meant to be high threats, and a tad more fitting of the alien places they tend to be in. Aka mini-bosses.
/mob/living/simple_mob/mechanical/hivebot/precusor
name = "Precursor Hivebot"
icon = 'modular_chomp/icons/mob/hivebot.dmi'
icon_state = "precursorhive"
icon_living = "precursorhive"
attacktext = list("prodded")
maxHealth = 5 LASERS_TO_KILL // 150 health
health = 5 LASERS_TO_KILL
movement_cooldown = 4
melee_damage_lower = 15
melee_damage_upper = 15
var/obj/item/shield_projector/shields = null
/mob/living/simple_mob/mechanical/hivebot/precusor/Initialize(mapload)
shields = new /obj/item/shield_projector/rectangle/automatic/hivebot_drone(src)
return ..()
/mob/living/simple_mob/mechanical/hivebot/precusor/machinegun
projectiletype = /obj/item/projectile/bullet/hivebot
base_attack_cooldown = 0 // Extremly rapid fire with rather weak bullets.
/mob/living/simple_mob/mechanical/hivebot/precusor/laser
projectiletype = /obj/item/projectile/beam/precursor
projectile_dispersion = 5
projectile_accuracy = -30
/mob/living/simple_mob/mechanical/hivebot/precusor/lobber
projectiletype = /obj/item/projectile/arc/blue_energy/precusor
/obj/item/projectile/arc/blue_energy/precusor
name = "energy missile"
icon_state = "force_missile"
armor_penetration = 10
damage = 50 // Mimics the precusor laser damage and armor peircing with a tad more damage because of the lobbying style.
damage_type = BURN
color = "#A020F0"
/obj/item/shield_projector/rectangle/automatic/hivebot_drone
shield_health = 100
max_shield_health = 100
shield_regen_delay = 5 SECONDS
shield_regen_amount = 20
size_x = 3
size_y = 3
color = "#A020F0"
high_color = "#A020F0"
low_color = "#A020F0"

View File

@@ -0,0 +1,5 @@
//Giving the tank hivebot class a new look,
/mob/living/simple_mob/mechanical/hivebot/tank
icon = 'modular_chomp/icons/mob/hivebot.dmi'
icon_state = "blue"
icon_living = "blue"

View File

@@ -1,8 +1,15 @@
/mob/living/simple_mob/mechanical/mecha/combat/gygax
movement_cooldown = 1 //Because normal Gygaxes are tougher then ths boss version with 0 speed
/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark/advanced
movement_cooldown = 0 //Because AADG needs all the help it can get.
/mob/living/simple_mob/mechanical/mecha/combat/gygax/aerostat
desc = "A Vir System Authority automated combat mech with an aged apperance."
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
say_list = /datum/say_list/gygax_aerostat
/datum/say_list/gygax_aerostat
speak = list("ALERT.","Hostile-ile-ile entities dee-twhoooo-wected.","Threat parameterszzzz- szzet.","Bring sub-sub-sub-systems uuuup to combat alert alpha-a-a.")
emote_see = list("beeps menacingly","whirrs threateningly","scans its immediate vicinity")

View File

@@ -0,0 +1,29 @@
/mob/living/simple_mob/construct/juggernaut/behemoth/unstoppable
name = "Behemoth"
real_name = "Behemoth"
desc = "The pinnacle of occult technology, Behemoths are nothing shy of both an Immovable Object, and Unstoppable Force."
melee_damage_lower = 45
melee_damage_upper = 55
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
projectiletype = /obj/item/projectile/icicle
/mob/living/simple_mob/construct/juggernaut/behemoth/unstoppable/bullet_act(var/obj/item/projectile/P)
var/reflectchance = 20 - round(P.damage/3)
if(prob(reflectchance))
visible_message("<span class='danger'>The [P.name] gets reflected by [src]'s shell!</span>", \
"<span class='userdanger'>The [P.name] gets reflected by [src]'s shell!</span>")
// Find a turf near or on the original location to bounce to
if(P.starting)
var/new_x = P.starting.x + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
var/new_y = P.starting.y + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
var/turf/curloc = get_turf(src)
// redirect the projectile
P.redirect(new_x, new_y, curloc, src)
P.reflected = 1
return -1 // complete projectile permutation
return (..(P))

View File

@@ -0,0 +1,47 @@
/mob/living/simple_mob/animal/passive/dog/stray
name = "dog"
desc = "The most standard dog you have ever seen, it even smells like one."
tt_desc = "Canis lupus familiaris"
//faction = "mexico" //They are from Mexico. //Amusing but this prompts aggression from crew-aligned mobs.
icon = 'modular_chomp/icons/turf/desert_tiles.dmi'
icon_state = "dog"
item_state = "dog"
icon_living = "dog"
icon_rest = "dog"
icon_dead = "dog"
health = 50
maxHealth = 50
mob_size = MOB_SMALL
pass_flags = PASSTABLE
can_pull_size = ITEMSIZE_TINY
can_pull_mobs = MOB_PULL_NONE
layer = MOB_LAYER
density = 1
movement_cooldown = 0.75 //roughly a bit faster than a person
response_help = "pets"
response_disarm = "rolls aside"
response_harm = "stomps"
melee_damage_lower = 5
melee_damage_upper = 7
attacktext = list("nips", "bumps", "scratches")
vore_taste = "wet dog"
min_oxy = 16 //Require atleast 16kPA oxygen
minbodytemp = 223 //Below -50 Degrees Celcius
maxbodytemp = 523 //Above 80 Degrees Celcius
heat_damage_per_tick = 3
cold_damage_per_tick = 3
meat_amount = 7
holder_type = /obj/item/weapon/holder/armadillo
ai_holder_type = /datum/ai_holder/simple_mob/armadillo
speak_emote = list("rumbles", "chirr?", "churr")
say_list_type = /datum/say_list/armadillo

View File

@@ -20,6 +20,13 @@
adminbus_trash = TRUE //You know what, sure whatever. It's not like anyone's gonna be taking this bird on unga trips to be their gamer backpack, which kinda was the main reason for the trash eater restrictions in the first place anyway.
faction = "neutral"
say_list_type = /datum/say_list/swoopie
var/static/list/crew_creatures = list( /mob/living/simple_mob/protean_blob,
/mob/living/simple_mob/slime/promethean)
/mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/IIsAlly(mob/living/L)
. = ..()
if(!.) // Outside the faction and not in friends, are they crew
return L?.type in crew_creatures
/mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/init_vore()
if(!voremob_loaded)

View File

@@ -1,6 +1,3 @@
/datum/sprite_accessory/marking
var/hide_body_parts = list()
/datum/sprite_accessory/marking/ch/anthrovirus_ra
name = "Anthro Virus (Right Arm)"
icon_state = "anthrovirus"
@@ -181,4 +178,4 @@
name = "Normal Eyes"
icon_state = "normeyes"
body_parts = list(BP_HEAD)
color_blend_mode = ICON_MULTIPLY
color_blend_mode = ICON_MULTIPLY

View File

@@ -5,6 +5,130 @@
/datum/sprite_accessory/tail/taur/wolf
vore_tail_sprite_variant = "N"
/datum/sprite_accessory/tail/taur/ch
icon = 'icons/mob/vore/taurs_ch.dmi'//Parent which allows us to not need to set icon every time.
/datum/sprite_accessory/tail/taur/ch/zorgoia
name = "Zorgoia (Taur)"
icon_state = "zorgoia"
extra_overlay = "zorgoia_fluff"
/datum/sprite_accessory/tail/taur/ch/zorgoia/fat
name = "Zorgoia (Fat Taur)"
extra_overlay = "zorgoia_fat"
/datum/sprite_accessory/tail/taur/ch/redpanda
name = "Red Panda (Taur)"
icon_state = "redpanda"
/datum/sprite_accessory/tail/taur/ch/redpandadc
name = "Red Panda (Taur dual-color)"
icon_state = "redpanda_dc"
extra_overlay = "redpanda_dc_markings"
/datum/sprite_accessory/tail/taur/ch/wolf/fatwolf_2c/fatwolfalt
name = "Fat Wolf 3-color-alt (Taur)"
icon_state = "fatwolfalt_s"
extra_overlay = "fatwolfalt_markings1"
extra_overlay2 = "fatwolfalt_markings2"
icon_sprite_tag = "wolf"
/datum/sprite_accessory/tail/taur/ch/naga/alt
name = "Naga alt (Taur)"
icon_state = "naga_alt_s"
suit_sprites = 'modular_chomp/icons/mob/taursuits_naga_ch.dmi'
msg_owner_help_walk = "You carefully slither around %prey."
msg_prey_help_walk = "%owner's huge tail slithers past beside you!"
msg_owner_help_run = "You carefully slither around %prey."
msg_prey_help_run = "%owner's huge tail slithers past beside you!"
msg_owner_disarm_run = "Your tail slides over %prey, pushing them down to the ground!"
msg_prey_disarm_run = "%owner's tail slides over you, forcing you down to the ground!"
msg_owner_disarm_walk = "You push down on %prey with your tail, pinning them down under you!"
msg_prey_disarm_walk = "%owner pushes down on you with their tail, pinning you down below them!"
msg_owner_harm_run = "Your heavy tail carelessly slides past %prey, crushing them!"
msg_prey_harm_run = "%owner quickly goes over your body, carelessly crushing you with their heavy tail!"
msg_owner_harm_walk = "Your heavy tail slowly and methodically slides down upon %prey, crushing against the floor below!"
msg_prey_harm_walk = "%owner's thick, heavy tail slowly and methodically slides down upon your body, mercilessly crushing you into the floor below!"
msg_owner_grab_success = "You slither over %prey with your large, thick tail, smushing them against the ground before coiling up around them, trapping them within the tight confines of your tail!"
msg_prey_grab_success = "%owner slithers over you with their large, thick tail, smushing you against the ground before coiling up around you, trapping you within the tight confines of their tail!"
msg_owner_grab_fail = "You squish %prey under your large, thick tail, forcing them onto the ground!"
msg_prey_grab_fail = "%owner pins you under their large, thick tail, forcing you onto the ground!"
msg_prey_stepunder = "You jump over %prey's thick tail."
msg_owner_stepunder = "%owner bounds over your tail."
/datum/sprite_accessory/tail/taur/ch/naga/alt_2c
name = "Naga dual-color alt (Taur)"
icon_state = "naga_alt_s"
extra_overlay = "naga_alt_markings"
suit_sprites = 'modular_chomp/icons/mob/taursuits_naga_ch.dmi'
msg_owner_help_walk = "You carefully slither around %prey."
msg_prey_help_walk = "%owner's huge tail slithers past beside you!"
msg_owner_help_run = "You carefully slither around %prey."
msg_prey_help_run = "%owner's huge tail slithers past beside you!"
msg_owner_disarm_run = "Your tail slides over %prey, pushing them down to the ground!"
msg_prey_disarm_run = "%owner's tail slides over you, forcing you down to the ground!"
msg_owner_disarm_walk = "You push down on %prey with your tail, pinning them down under you!"
msg_prey_disarm_walk = "%owner pushes down on you with their tail, pinning you down below them!"
msg_owner_harm_run = "Your heavy tail carelessly slides past %prey, crushing them!"
msg_prey_harm_run = "%owner quickly goes over your body, carelessly crushing you with their heavy tail!"
msg_owner_harm_walk = "Your heavy tail slowly and methodically slides down upon %prey, crushing against the floor below!"
msg_prey_harm_walk = "%owner's thick, heavy tail slowly and methodically slides down upon your body, mercilessly crushing you into the floor below!"
msg_owner_grab_success = "You slither over %prey with your large, thick tail, smushing them against the ground before coiling up around them, trapping them within the tight confines of your tail!"
msg_prey_grab_success = "%owner slithers over you with their large, thick tail, smushing you against the ground before coiling up around you, trapping you within the tight confines of their tail!"
msg_owner_grab_fail = "You squish %prey under your large, thick tail, forcing them onto the ground!"
msg_prey_grab_fail = "%owner pins you under their large, thick tail, forcing you onto the ground!"
msg_prey_stepunder = "You jump over %prey's thick tail."
msg_owner_stepunder = "%owner bounds over your tail."
/datum/sprite_accessory/tail/taur/ch/horse/scoli
name = "Scolipede (Taur)"
icon_state = "scoli_s"
extra_overlay = "scoli_markings1"
extra_overlay2 = "scoli_markings2"
/datum/sprite_accessory/tail/taur/ch/sergal/wheaties
name = "Sergal (Taur)"
icon_state = "sergwheat"
icon_sprite_tag = "wolf"
vore_tail_sprite_variant = "N"
/datum/sprite_accessory/tail/taur/ch/sergal/fatwheaties
name = "Fat Sergal (Taur)"
icon_state = "fatsergal"
icon_sprite_tag = "wolf"
/datum/sprite_accessory/tail/taur/ch/sergal/wheaties_2c
name = "Sergal (Taur, dual-color)"
icon_state = "sergwheat"
extra_overlay = "sergwheat_markings"
icon_sprite_tag = "wolf"
vore_tail_sprite_variant = "N"
/datum/sprite_accessory/tail/taur/ch/sergal/fatwheaties_2c
name = "Fat Sergal (Taur, dual-color)"
icon_state = "fatsergal"
extra_overlay = "sergwheat_markings"
icon_sprite_tag = "wolf"
/datum/sprite_accessory/tail/taur/ch/longvirus
name = "Long Virus (Taur)"
icon_state = "longvirus_s"

View File

@@ -1,3 +1,6 @@
/obj/item/organ/external
var/prosthetic_digi = FALSE //CHOMPStation edit - when it's prosthetic, can it be a digitigrade
//new function to check for markings
/obj/item/organ/external/proc/is_hidden_by_markings()
//code that checked all limbs.

View File

@@ -4,170 +4,86 @@
// preferentially take digitigrade value from owner if available, THEN DNA.
// this allows limbs to be set properly when being printed in the bioprinter without an owner
// this also allows the preview mannequin to update properly because customisation topic calls don't call a DNA check
var/check_digi = istype(src,/obj/item/organ/external/leg) || istype(src,/obj/item/organ/external/foot)
if(owner)
digitigrade = owner.digitigrade
digitigrade = check_digi && owner.digitigrade
else if(dna)
digitigrade = dna.digitigrade
digitigrade = check_digi && dna.digitigrade
if( !model && ( istype(src,/obj/item/organ/external/leg) || istype(src,/obj/item/organ/external/foot) ) ) //All leg icons go through here now.
var/robotic_digi = prosthetic_digi && digitigrade //could make it so the prosthetic digi var is more of a "does this limb have a custom digitigrade sprite for its robospriting" but this is fine for now
var/gender = "m"
if(owner && owner.gender == FEMALE)
gender = "f"
if(!force_icon_key)
icon_cache_key = "[icon_name]_[species ? species.get_bodytype() : SPECIES_HUMAN]" //VOREStation Edit
else
icon_cache_key = "[icon_name]_[force_icon_key]"
if(force_icon)
mob_icon = new /icon(force_icon, "[icon_name][gendered_icon ? "_[gender]" : ""]")
else
if(!dna)
mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_[gender]" : ""]")
else
if(!gendered_icon)
gender = null
else
if(dna.GetUIState(DNA_UI_GENDER))
gender = "f"
else
gender = "m"
if(skeletal)
mob_icon = new /icon('icons/mob/human_races/r_skeleton.dmi', "[icon_name][gender ? "_[gender]" : ""]")
else if (robotic >= ORGAN_ROBOT)
mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]")
apply_colouration(mob_icon)
else
if(is_hidden_by_markings())
mob_icon = new /icon('icons/mob/human_races/r_blank.dmi', "[icon_name][gender ? "_[gender]" : ""]")
else
//Use digi icon if digitigrade, otherwise use regular icon. Ternary operator is based.
mob_icon = new /icon(digitigrade ? species.icodigi : species.get_icobase(owner, (status & ORGAN_MUTATED)), "[icon_name][gender ? "_[gender]" : ""]")
apply_colouration(mob_icon)
//Code here is copied from organ_icon.dm line 118 at time of writing (9/20/21), VOREStation edits are left in intentionally, because I think it's worth keeping track of the fact that the code is from Virgo's edits.
//Body markings, actually does not include head this time. Done separately above.
if(!istype(src,/obj/item/organ/external/head))
for(var/M in markings)
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/isdigitype = istype(mark_style,/datum/sprite_accessory/marking/digi)
if(!(digitigrade ^ isdigitype)) //Equivalent to XNOR; this code will only run if either both digitigrade and isdigitype are true, or if both are false.
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit
add_overlay(mark_s) //So when it's not on your body, it has icons
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
if(body_hair && islist(h_col) && h_col.len >= 3)
var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]"
if(!limb_icon_cache[cache_key])
var/icon/I = icon(species.get_icobase(owner), "[icon_name]_[body_hair]")
I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_MULTIPLY) //VOREStation edit
limb_icon_cache[cache_key] = I
mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY)
// VOREStation edit start
if(nail_polish)
var/icon/I = new(nail_polish.icon, nail_polish.icon_state)
I.Blend(nail_polish.color, ICON_MULTIPLY)
add_overlay(I)
mob_icon.Blend(I, ICON_OVERLAY)
icon_cache_key += "_[nail_polish.icon]_[nail_polish.icon_state]_[nail_polish.color]"
// VOREStation edit end
dir = EAST
icon = mob_icon
return mob_icon
var/gender = "m"
if(owner && owner.gender == FEMALE)
gender = "f"
if(!force_icon_key)
icon_cache_key = "[icon_name]_[species ? species.get_bodytype() : SPECIES_HUMAN]" //VOREStation Edit
else
//. = ..()
//due to the wierd fact that this calls the old code, and defining it here makes a duplicate procedure error, i'm gonna have to bring the whole code here and modify it. if there is a more condensed way, it is appreciated.
icon_cache_key = "[icon_name]_[force_icon_key]"
var/gender = "m"
if(owner && owner.gender == FEMALE)
gender = "f"
if(!force_icon_key)
icon_cache_key = "[icon_name]_[species ? species.get_bodytype() : SPECIES_HUMAN]" //VOREStation Edit
if(force_icon && !robotic_digi)
mob_icon = new /icon(force_icon, "[icon_name][gendered_icon ? "_[gender]" : ""]")
else
if(!dna)
mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_[gender]" : ""]")
else
icon_cache_key = "[icon_name]_[force_icon_key]"
if(force_icon)
mob_icon = new /icon(force_icon, "[icon_name][gendered_icon ? "_[gender]" : ""]")
else
if(!dna)
mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_[gender]" : ""]")
if(!gendered_icon)
gender = null
else
if(!gendered_icon)
gender = null
if(dna.GetUIState(DNA_UI_GENDER))
gender = "f"
else
if(dna.GetUIState(DNA_UI_GENDER))
gender = "f"
else
gender = "m"
gender = "m"
if(skeletal)
mob_icon = new /icon('icons/mob/human_races/r_skeleton.dmi', "[icon_name][gender ? "_[gender]" : ""]")
else if (robotic >= ORGAN_ROBOT)
mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]")
if(skeletal)
mob_icon = new /icon('icons/mob/human_races/r_skeleton.dmi', "[icon_name][gender ? "_[gender]" : ""]")
else if (robotic >= ORGAN_ROBOT && !robotic_digi)
mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]")
apply_colouration(mob_icon)
else
if(is_hidden_by_markings())
mob_icon = new /icon('icons/mob/human_races/r_blank.dmi', "[icon_name][gender ? "_[gender]" : ""]")
else
//Use digi icon if digitigrade, otherwise use regular icon. Ternary operator is based.
mob_icon = new /icon(digitigrade ? species.icodigi : species.get_icobase(owner, (status & ORGAN_MUTATED)), "[icon_name][gender ? "_[gender]" : ""]")
apply_colouration(mob_icon)
else
if(is_hidden_by_markings())
mob_icon = new /icon('icons/mob/human_races/r_blank.dmi', "[icon_name][gender ? "_[gender]" : ""]")
else
//Use digi icon if digitigrade, otherwise use regular icon. Ternary operator is based.
mob_icon = new /icon(species.get_icobase(owner, (status & ORGAN_MUTATED)), "[icon_name][gender ? "_[gender]" : ""]")
apply_colouration(mob_icon)
//Body markings, actually does not include head this time. Done separately above.
if(!istype(src,/obj/item/organ/external/head))
for(var/M in markings)
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit
add_overlay(mark_s) //So when it's not on your body, it has icons
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
if (model && !robotic_digi)
icon_cache_key += "_model_[model]"
apply_colouration(mob_icon)
if(body_hair && islist(h_col) && h_col.len >= 3)
var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]"
if(!limb_icon_cache[cache_key])
var/icon/I = icon(species.get_icobase(owner), "[icon_name]_[body_hair]")
I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_MULTIPLY) //VOREStation edit
limb_icon_cache[cache_key] = I
mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY)
//Code here is copied from organ_icon.dm line 118 at time of writing (9/20/21), VOREStation edits are left in intentionally, because I think it's worth keeping track of the fact that the code is from Virgo's edits.
//Body markings, actually does not include head this time. Done separately above.
if((!istype(src,/obj/item/organ/external/head) && !(force_icon && !robotic_digi)) || (model && owner && owner.synth_markings))
for(var/M in markings)
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/isdigitype = mark_style.digitigrade_acceptance
if(check_digi)
if (!(isdigitype & (digitigrade ? MARKING_DIGITIGRADE_ONLY : MARKING_NONDIGI_ONLY))) //checks flags based on which digitigrade type the limb is
continue
var/icon/mark_s = new/icon("icon" = digitigrade ? mark_style.digitigrade_icon : mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit
add_overlay(mark_s) //So when it's not on your body, it has icons
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
if(body_hair && islist(h_col) && h_col.len >= 3)
var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]"
if(!limb_icon_cache[cache_key])
var/icon/I = icon(species.get_icobase(owner), "[icon_name]_[body_hair]")
I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_MULTIPLY) //VOREStation edit
limb_icon_cache[cache_key] = I
mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY)
// VOREStation edit start
if(nail_polish)
var/icon/I = new(nail_polish.icon, nail_polish.icon_state)
I.Blend(nail_polish.color, ICON_MULTIPLY)
add_overlay(I)
mob_icon.Blend(I, ICON_OVERLAY)
icon_cache_key += "_[nail_polish.icon]_[nail_polish.icon_state]_[nail_polish.color]"
// VOREStation edit end
// VOREStation edit start
if(nail_polish && (force_icon && !robotic_digi))
var/icon/I = new(nail_polish.icon, nail_polish.icon_state)
I.Blend(nail_polish.color, ICON_MULTIPLY)
add_overlay(I)
mob_icon.Blend(I, ICON_OVERLAY)
icon_cache_key += "_[nail_polish.icon]_[nail_polish.icon_state]_[nail_polish.color]"
// VOREStation edit end
if(model)
icon_cache_key += "_model_[model]"
apply_colouration(mob_icon)
if(owner && owner.synth_markings)
for(var/M in markings)
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit
add_overlay(mark_s) //So when it's not on your body, it has icons
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
if(body_hair && islist(h_col) && h_col.len >= 3)
var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]"
if(!limb_icon_cache[cache_key])
var/icon/I = icon(species.get_icobase(owner), "[icon_name]_[body_hair]")
I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_MULTIPLY) //VOREStation edit
limb_icon_cache[cache_key] = I
mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY)
// VOREStation edit ends here
dir = EAST
icon = mob_icon
return mob_icon
dir = EAST
icon = mob_icon
return mob_icon

View File

@@ -0,0 +1,81 @@
/* List of player tips
Weighted to emphasize more important over less.area
Weights are not additive. You can have multiple prob(50) items.
prob(50) makes it half as likely to appear and so forth.
When editing the list, please try and keep similar probabilities near each other. High on top, low on bottom */
//argument determines if to pick a random tip or use a forced choice.
/datum/player_tips/proc/pick_tip(var/isSpecific)
var/choice = null
if(!(isSpecific == "none" || isSpecific == "general" || isSpecific == "gameplay" || isSpecific == "roleplay" || isSpecific == "lore" ))
choice = "none" //Making sure that wrong arguments still give tips.
if(isSpecific == "none")
choice = pick (
prob(50); "general",
prob(50); "gameplay",
prob(25); "roleplay",
prob(20); "lore"
)
else
choice = isSpecific
switch(choice)
if("general")
var/info = "The following is a general tip to playing on CHOMPStation! You can disable them using the periodic tips toggle in the Global tab of character setup! \n"
return pick(
prob(60); "[info] Got a question about gameplay, roleplay or the setting? Press F1 to Mentorhelp!",
prob(60); "[info] We have a wiki that is actively updated! Please check it out at https://wiki.chompstation13.net/index.php/Chomp_Station_Wiki for help!",
prob(60); "[info] Unsure about rules? Press F1 and ask our admins for clarification - they are happy to help.",
prob(30); "[info] Don't be afraid to approach your fellow players for advice! Learning things ICly can help build powerful bonds!",
prob(30); "[info] Need some guideance making a character or with roleplay concepts? Our discord's tutoring channel is happy to help!",
prob(30); "[info] Having difficulties getting started? Pressing F3 to speak and typing '; Hello! I'm a new hire. Could someone please give me a tour?' or as appropriate for your character is a good way to start! More help available at: https://wiki.chompstation13.net/index.php/The_Basics",
prob(30); "[info] Want to try out a new department? Consider joining as an intern when it's well-staffed. Our players enjoy teaching eager students. You can approach such roleplay as simply getting taught the local technologies, procedures - you don't need to be 'fresh out of school' to justify it!",
prob(30); "[info] Our discord is an excellent resource to stay up to date about changes and events! If wanting to separate your kink and real identities, Discord has a built in means to swap accounts within the client. It is OK to lurk!",
prob(5); "[info] Got another tip for the list? Please let us know on Discord in the feedback forums!"
)
if("gameplay")
var/info = "The following is a gameplay-focused tip to playing on CHOMPStation! You can disable them using the periodic tips toggle in the Global tab of character setup! \n"
return pick(
prob(50); "[info] To talk to your fellow coworkers, use ';'! You may append it by an exclamation mark, like ';!' to perform an audiable emote. ",
prob(50); "[info] Lost on the map? You can find In-Character help by speaking on the Common Radio. You can do this by pressing F3 and typing ' ; ' before your message. Your fellow co-workers will likely help. If OOC help is preferred, press F1 for mentorhelp. ",
prob(50); "[info] You may set your suit sensors by clicking on the icon in the bottom left corner, then right click the clothes that appear right above it. It is recommended to turn on suit sensors to 'TRACKING' before doing anything dangerous like mining, and to turn them off before digestion scenes as prey.",
prob(35); "[info] It is never a bad idea to visit the medbay if you get injured - small burns and cuts can get infected and become harder to treat! If there is no medical staff, bathrooms and the bar often has a NanoMed on the wall while a medical station can be found on the first deck - with ointments to disinfect cuts and burns, bandages to treat bruises and encourage healing.",
prob(25); "[info] Two control modes exist for SS13 - hotkey ON and hotkey OFF. You can swap between the two modes by pressing TAB. In hotkey mode, to chat you need to press T to say anything which creates a small talking bubble.",
prob(25); "[info] Do you want to shift your character around, for instance to appear as if leaning on the wall? Press CTRL + SHIFT + arrow keys to do so! Moving resets this.",
prob(25); "[info] Emergency Fire Doors seal breaches and keep active fires out. Please do not open them without good reason. SHIFT + CLICK them to get temperature and atmospheric pressure readings.",
prob(25); "[info] The kitchen's Oven can fit multiple ingredients in one slot if you pull the baking tray out first. This is required for most recipes, and the Grille and Deep Frier work the same way!",
prob(10); "[info] Not every hostile NPC you encounter while mining or exploring need to be defeated. Sometimes, it's better to avoid or run away from them.",
prob(1); "[info] Stay robust, my friends.",
prob(35); "[info] You can insert your I.D into your PDA. This frees up your belt from having to carry your PDA. Furthermore, by clicking and dragging the PDA to game screen, you can use it without holding it!",
prob(35); "[info] Your vore-bellies have multiple add-ons! Muffling is excellent to ensure your prey does not accidentally inform everyone about their predicament, and jam suit sensors is a great courtesy to avoid medical being worried about your prey!"
)
if("roleplay")
var/info = "The following is a roleplay-focused tip to playing on CHOMPStation! You can disable them using the periodic tips toggle in the Global tab of character setup! \n"
return pick(
prob(50); "[info] Having difficulty finding scenes? The number one tip that people should take for finding scenes is to be active! Generally speaking, people are more likely to interact with you if you are moving about and doing things. Don't be afraid to talk to people, you're less likely to be approached if you're sat alone at a table silently. People that are looking for scenes generally like to see how you type and RP before they'll start working towards a scene with you.",
prob(50); "[info] Please avoid a character that knows everything. Having only a small set of jobs you are capable of doing can help flesh out your character! It's OK for things to break and fail if nobody is around to fix it - you do not need to do others' jobs.",
prob(25); "[info] Embrace the limits of your character's skillsets! Seeking out other players to help you with a more challenging task might build friendships, or even lead to a scene!",
prob(25); "[info] Slowing down when meeting another player can help with finding roleplay! Your fellow player might be typing up a greeting or an emote, and if you run off you won't see it!",
prob(25); "[info] It is a good idea to wait a few moments after using mechanics like lick, hug or headpat on another player. They might be typing up a response or wish to reciprocate, and if you run away you might miss out!",
prob(25); "[info] Participating in an away mission and see something acting strange? Try emoting or talking to it before resorting to fighting. It may be a GM event!",
prob(15); "[info] We are a medium roleplay server. This does not neccessarily mean 'serious' roleplay, levity and light-hearted RP is more than welcome! Please do not ignore people just because it is unlikely you will be able to scene.",
prob(10); "[info] Sending faxes to central command, using the 'pray' verb or pressing F1 to ahelp are highly encouraged when exploring the gateway or overmap locations! Letting GMs know something fun is happening allows them to spice things up and make the world feel alive!",
prob(40); "[info] Just because you see something doesn't mean your character has to. A courtesy 'missing' of contraband or scene details can go a long way towards preserving everyone's fun!",
prob(25); "[info] It is always a good idea to communicate on your department's private channel (whose key you can learn by examining your headset) when responding to an emergency! This lets your coworkers know if they might be needed!",
prob(25); "[info] While following the SOP is not mandatory, and you are free to break it (albeit, with potential in-character consequences), departments like security and medical do well to be familiar with them! https://wiki.chompstation13.net/index.php/Standard_Operating_Procedure",
prob(25); "[info] Think a player is acting especially antagonistic? It might be better to Ahelp (with F1) rather than try to deal with it icly, staff can make sure it's all okay.",
prob(20); "[info] See a minor infraction as Security with a minimal time punishment? Consider using your ticket printer to give a non obtrusive punishment."
)
if("lore")
var/info = "The following is tip for understanding the lore of CHOMPStation! You can disable them using the periodic tips toggle in the Global tab of character setup! \n"
return pick(
prob(25); "[info] Our lore is somewhat in line with other servers. But not Virgo's. They wrote themselves out of the timeline, lol. The year is 2564 (current year+541).",
prob(75); "[info] You can find a short summary of our setting that everyone should know at https://wiki.chompstation13.net/index.php/Lore",
prob(50); "[info] You are currently working in the Vir system on the NLS Southern Cross telecommunications and traffic control station. https://wiki.chompstation13.net/index.php/Vir",
prob(50); "[info] The majority of employees live at the Northern Star asteroid colony orbiting a gas giant called Kara. It is also a central hub for visitors, logistics, and mining. This is the place the shuttle takes you at the end of the round. You may visit the mines via the exploration shuttles. https://wiki.chompstation13.net/index.php/NCS_Northern_Star",
prob(10); "[info] Thaler is a universal monopoly money. It is backed and supported by Sol Central and its allies. While ubiquitous in frontier worlds, it has an unfavourable exchange rate with most currencies used by well-settled regions, limiting immigration to places such as Earth. https://wiki.chompstation13.net/index.php/Lore"
)

View File

@@ -3,7 +3,7 @@
desc = "Stuff it with paper and shoot! You'll be a hit at every party."
id = "confetti_cannon"
req_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 3000)
materials = list(MAT_STEEL = 3000, MAT_GLASS = 3000)
build_path = /obj/item/weapon/gun/launcher/confetti_cannon
sort_string = "MAAVD"
@@ -11,34 +11,71 @@
/datum/design/item/weapon/phase/phase_pistol
id = "phasepistol"
req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2, TECH_POWER = 2)
materials = list(DEFAULT_WALL_MATERIAL = 4000, MAT_COPPER = 30)
materials = list(MAT_STEEL = 4000, MAT_GLASS = 500)
build_path = /obj/item/weapon/gun/energy/locked/phasegun/pistol
sort_string = "MACAA"
/datum/design/item/weapon/phase/phase_carbine
id = "phasecarbine"
req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2, TECH_POWER = 2)
materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1500, MAT_COPPER = 40)
materials = list(MAT_STEEL = 6000, MAT_GLASS = 500)
build_path = /obj/item/weapon/gun/energy/locked/phasegun
sort_string = "MACAB"
/datum/design/item/weapon/phase/phase_rifle
id = "phaserifle"
req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3)
materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 2000, "silver" = 500)
materials = list(MAT_STEEL = 7000, MAT_GLASS = 500, MAT_SILVER = 500)
build_path = /obj/item/weapon/gun/energy/locked/phasegun/rifle
sort_string = "MACAC"
/datum/design/item/weapon/phase/phase_cannon
id = "phasecannon"
req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 4, TECH_POWER = 4)
materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 2000, "silver" = 1000, "diamond" = 750)
materials = list(MAT_STEEL = 10000, MAT_GLASS = 2000, MAT_SILVER = 2000, MAT_DIAMOND = 750)
build_path = /obj/item/weapon/gun/energy/locked/phasegun/cannon
sort_string = "MACAD"
/datum/design/item/weapon/phase/frontier_holdout
id = "holdout frontier phaser"
req_tech = list(TECH_COMBAT = 4, TECH_POWER = 7, TECH_MATERIAL = 6, TECH_PHORON = 6)
materials = list(MAT_STEEL = 6000, MAT_GLASS = 900, MAT_DURASTEEL = 100, MAT_METALHYDROGEN = 150, MAT_VERDANTIUM = 100, MAT_PHORON = 1000)
build_path = /obj/item/weapon/gun/energy/locked/frontier/holdout
sort_string = "MACAE"
/datum/design/item/weapon/phase/frontier_phaser
id = "frontier phaser"
req_tech = list(TECH_COMBAT = 4, TECH_POWER = 7, TECH_MATERIAL = 6, TECH_PHORON = 6)
materials = list(MAT_STEEL = 7000, MAT_GLASS = 900, MAT_DURASTEEL = 100, MAT_METALHYDROGEN = 200, MAT_VERDANTIUM = 150, MAT_PHORON = 2000)
build_path = /obj/item/weapon/gun/energy/locked/frontier
sort_string = "MACAF"
/datum/design/item/weapon/phase/frontier_carbine
id = "carbine frontier phaser"
req_tech = list(TECH_COMBAT = 4, TECH_POWER = 8, TECH_MATERIAL = 6, TECH_PHORON = 6)
materials = list(MAT_STEEL = 6500, MAT_GLASS = 900, MAT_DURASTEEL = 150, MAT_METALHYDROGEN = 250, MAT_VERDANTIUM = 200, MAT_PHORON = 4000)
build_path = /obj/item/weapon/gun/energy/locked/frontier/carbine
sort_string = "MACAG"
/datum/design/item/weapon/phase/frontier_rifle
id = "marksman rifle frontier phaser"
req_tech = list(TECH_COMBAT = 4, TECH_POWER = 7, TECH_MATERIAL = 6, TECH_PHORON = 6)
materials = list(MAT_STEEL = 8000, MAT_GLASS = 900, MAT_DURASTEEL = 200, MAT_METALHYDROGEN = 300, MAT_VERDANTIUM = 250, MAT_PHORON = 2000)
build_path = /obj/item/weapon/gun/energy/locked/frontier/rifle
sort_string = "MACAH"
/datum/design/item/weapon/phase/frontier_handbow
id = "handbow frontier phaser"
req_tech = list(TECH_COMBAT = 4, TECH_POWER = 7, TECH_MATERIAL = 6, TECH_PHORON = 6)
materials = list(MAT_STEEL = 5000, MAT_GLASS = 900, MAT_DURASTEEL = 100, MAT_METALHYDROGEN = 200, MAT_VERDANTIUM = 150, MAT_PHORON = 1000)
build_path = /obj/item/weapon/gun/energy/locked/frontier/handbow
sort_string = "MACAI"
//Leathals And any new CHOMP weapons.
/datum/design/item/weapon/gun/projectile/caseless/prototype
id = "caselessrifle"
req_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 5, TECH_PHORON = 5)
materials = list(DEFAULT_WALL_MATERIAL = 7000, "titanium" = 4000)
materials = list(MAT_STEEL = 7000, MAT_TITANIUM = 4000)
build_path = /obj/item/weapon/gun/projectile/caseless/prototype
sort_string = "MACAE"
sort_string = "MACBA"

View File

@@ -6,9 +6,8 @@
// And optionally, this could be gated behind another preference, to prevent stunlock being abused.
if((mob_always_swap || (a_intent == I_HELP || src.restrained()) && (target.a_intent == I_HELP || target.restrained())) && target.canmove && target.handle_micro_bump_helping(src))
return
else if(!(target.a_intent == I_HELP || target.restrained()) && target.handle_micro_bump_other(src))
if(!(target.a_intent == I_HELP || target.restrained()))
if(src.step_mechanics_pref && target.step_mechanics_pref)
target.handle_micro_bump_other(src)
else
target.handle_micro_bump_other(src, 1)
return