mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-09 07:46:20 +00:00
Adds an easy bitrunning domain themed around sacrifing people, also makes digitital beings not care about death (#93546)
## About The Pull Request 1. Adds `Heretical Hunt`, an easy difficulty domain that tasks you with killing and sacrificing simulated crew members. The domain has a few ways to conquer it, as you don't need to kill all the simulated crew members and there's some hidden loot to make use of It's an easy domain because - You have quite decent armor, - The mobs are pretty unintelligent, - You can always fall back and heal passively on the rust tiles - There are many ways to tackle it Though it's not a complete pushover, the mobs can still overwhelm you if you're not careful. <img width="440" height="347" alt="image" src="https://github.com/user-attachments/assets/a3f30204-0200-4197-80bb-aee083059164" /> 2. Virtual beings are given a minor positive moodlet for killing people instead of a negative one ## Why It's Good For The Game 1. I thought it'd be kinda fun if we had antag-themed domains which soft-explains the gameplay loops or mechanics of certain antags, in this case, heretics sacrificing people 2. You don't feel remorse for killing people in video games, right anon? ## Changelog 🆑 Melbert add: Added a new easy difficulty bitrunning domain, "Heretical Hunt" add: Digital mobs receive positive moodlets for killing people rather than negative fix: Madness Mask no longer affects corpses fix: Fixed some heretic runtimes /🆑
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
## Creating a new safe house
|
||||
|
||||
1. Create a new map inside the `_maps\safe_houses` folder using the TGM format.
|
||||
2. Create a new dm file inside `modules\bitrunning\virtual_domain\safe_houses` folder..
|
||||
2. Update `safehouse.toml` with your new file
|
||||
3. Place exit and goal landmarks (obj/effect/landmark/bitrunning/..). Generally, 3 exits and 2 goals are ok.
|
||||
4. Ideally, leave 3 spaces for gear. This has usually been xy [1x1] [1x2] [1x3]
|
||||
5. Place the modular map connector at the bottom left tile.
|
||||
|
||||
131
_maps/safehouses/maintsafe.dmm
Normal file
131
_maps/safehouses/maintsafe.dmm
Normal file
@@ -0,0 +1,131 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/open/floor/plating,
|
||||
/area/virtual_domain/safehouse)
|
||||
"g" = (
|
||||
/obj/structure/broken_flooring/corner/directional/north,
|
||||
/turf/open/floor/plating,
|
||||
/area/virtual_domain/safehouse)
|
||||
"i" = (
|
||||
/obj/effect/decal/cleanable/cobweb,
|
||||
/turf/open/floor/plating,
|
||||
/area/virtual_domain/safehouse)
|
||||
"j" = (
|
||||
/turf/closed/wall,
|
||||
/area/virtual_domain/safehouse)
|
||||
"l" = (
|
||||
/obj/effect/landmark/bitrunning/hololadder_spawn,
|
||||
/obj/effect/mapping_helpers/broken_floor,
|
||||
/turf/open/floor/iron,
|
||||
/area/virtual_domain/safehouse)
|
||||
"q" = (
|
||||
/obj/effect/landmark/bitrunning/hololadder_spawn,
|
||||
/obj/effect/mapping_helpers/broken_floor,
|
||||
/obj/effect/decal/cleanable/dirt/dust,
|
||||
/obj/structure/railing{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/iron,
|
||||
/area/virtual_domain/safehouse)
|
||||
"t" = (
|
||||
/obj/effect/landmark/bitrunning/cache_goal_turf,
|
||||
/turf/open/indestructible/bitrunning_transport,
|
||||
/area/virtual_domain/safehouse)
|
||||
"v" = (
|
||||
/obj/structure/broken_flooring/side/directional/north,
|
||||
/obj/effect/decal/cleanable/dirt/dust,
|
||||
/turf/open/floor/plating,
|
||||
/area/virtual_domain/safehouse)
|
||||
"y" = (
|
||||
/obj/effect/mapping_helpers/broken_floor,
|
||||
/obj/effect/decal/cleanable/dirt/dust,
|
||||
/turf/open/floor/plating,
|
||||
/area/virtual_domain/safehouse)
|
||||
"C" = (
|
||||
/obj/structure/broken_flooring/singular/directional/north,
|
||||
/obj/structure/railing/corner/end/flip,
|
||||
/turf/open/floor/plating,
|
||||
/area/virtual_domain/safehouse)
|
||||
"E" = (
|
||||
/obj/machinery/light/red/dim/directional/west,
|
||||
/obj/effect/decal/cleanable/dirt/dust,
|
||||
/turf/open/floor/plating,
|
||||
/area/virtual_domain/safehouse)
|
||||
"I" = (
|
||||
/obj/machinery/door/airlock/maintenance_hatch,
|
||||
/turf/open/floor/plating,
|
||||
/area/virtual_domain/safehouse)
|
||||
"M" = (
|
||||
/obj/effect/landmark/bitrunning/hololadder_spawn,
|
||||
/obj/effect/decal/cleanable/dirt/dust,
|
||||
/turf/open/floor/iron,
|
||||
/area/virtual_domain/safehouse)
|
||||
"N" = (
|
||||
/obj/effect/decal/cleanable/dirt/dust,
|
||||
/turf/open/floor/plating,
|
||||
/area/virtual_domain/safehouse)
|
||||
"O" = (
|
||||
/obj/effect/mapping_helpers/broken_floor,
|
||||
/turf/open/floor/plating,
|
||||
/area/virtual_domain/safehouse)
|
||||
"Y" = (
|
||||
/obj/machinery/light/red/dim/directional/east,
|
||||
/turf/open/floor/plating,
|
||||
/area/virtual_domain/safehouse)
|
||||
|
||||
(1,1,1) = {"
|
||||
j
|
||||
j
|
||||
j
|
||||
j
|
||||
j
|
||||
j
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
j
|
||||
i
|
||||
E
|
||||
g
|
||||
M
|
||||
j
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
j
|
||||
y
|
||||
N
|
||||
v
|
||||
l
|
||||
j
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
I
|
||||
N
|
||||
a
|
||||
C
|
||||
q
|
||||
j
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
j
|
||||
a
|
||||
y
|
||||
N
|
||||
t
|
||||
j
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
j
|
||||
O
|
||||
Y
|
||||
N
|
||||
t
|
||||
j
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
j
|
||||
j
|
||||
j
|
||||
j
|
||||
j
|
||||
j
|
||||
"}
|
||||
2373
_maps/virtual_domains/heretic_hunt.dmm
Normal file
2373
_maps/virtual_domains/heretic_hunt.dmm
Normal file
File diff suppressed because it is too large
Load Diff
@@ -369,6 +369,8 @@
|
||||
#define COMSIG_LIVING_DROP_LOOT "living_drop_loot"
|
||||
/// Prevent loot from being dropped
|
||||
#define COMPONENT_NO_LOOT_DROP (1<<0)
|
||||
/// From /datum/element/death_drops/on_death(mob/living/target, gibbed) : (list/loot, gibbed)
|
||||
#define COMSIG_LIVING_DROPPED_LOOT "living_dropped_loot"
|
||||
|
||||
/// From /mob/living/proc/mob_pickup() : (mob/living/user, obj/item/mob_holder/holder)
|
||||
#define COMSIG_LIVING_SCOOPED_UP "living_scooped_up"
|
||||
|
||||
@@ -41,15 +41,18 @@
|
||||
if (SEND_SIGNAL(target, COMSIG_LIVING_DROP_LOOT, spawn_loot, gibbed) & COMPONENT_NO_LOOT_DROP)
|
||||
return
|
||||
|
||||
var/list/all_loot = list()
|
||||
for(var/thing_to_spawn in spawn_loot)
|
||||
for(var/i in 1 to (spawn_loot[thing_to_spawn] || 1))
|
||||
create_loot(thing_to_spawn, loot_loc, target, gibbed, spread_px = spawn_loot.len * 3)
|
||||
all_loot += create_loot(thing_to_spawn, loot_loc, target, gibbed, spread_px = spawn_loot.len * 3)
|
||||
|
||||
list_clear_nulls(all_loot) // in case of gibbed corpses
|
||||
SEND_SIGNAL(target, COMSIG_LIVING_DROPPED_LOOT, all_loot, gibbed)
|
||||
|
||||
/// Handles creating the loots
|
||||
/datum/element/death_drops/proc/create_loot(typepath, atom/loot_loc, mob/living/dead, gibbed, spread_px = 4)
|
||||
if(ispath(typepath, /obj/effect/mob_spawn/corpse))
|
||||
handle_corpse(typepath, loot_loc, dead, gibbed)
|
||||
return
|
||||
return handle_corpse(typepath, loot_loc, dead, gibbed)
|
||||
|
||||
var/drop = new typepath(loot_loc)
|
||||
if(isitem(drop) && spread_px)
|
||||
@@ -57,6 +60,7 @@
|
||||
var/clamped_px = clamp(spread_px, 0, 16)
|
||||
dropped_item.pixel_x = rand(-clamped_px, clamped_px)
|
||||
dropped_item.pixel_y = rand(-clamped_px, clamped_px)
|
||||
return drop
|
||||
|
||||
/// Handles snowflake case of mob corpses
|
||||
/datum/element/death_drops/proc/handle_corpse(typepath, atom/loot_loc, mob/living/dead, gibbed)
|
||||
@@ -68,7 +72,8 @@
|
||||
// if gibbed, dispose of the body
|
||||
if(gibbed)
|
||||
body.gib(DROP_ALL_REMAINS)
|
||||
return
|
||||
return null
|
||||
// otherwise continue with the rest of the damage types
|
||||
body.setToxLoss(dead.getToxLoss())
|
||||
body.setOxyLoss(dead.getOxyLoss())
|
||||
return body
|
||||
|
||||
@@ -573,6 +573,11 @@
|
||||
if(HAS_TRAIT(dead_mob, TRAIT_SPAWNED_MOB))
|
||||
mood_change *= 0.25
|
||||
timeout *= 0.2
|
||||
if(istype(owner.mind?.assigned_role, /datum/job/bitrunning_glitch) || istype(owner.mind?.assigned_role, /datum/job/bit_avatar))
|
||||
// Digital beings shouldn't care about death it's just gaming
|
||||
mood_change *= -0.25
|
||||
description = "Another one bites the dust!"
|
||||
return
|
||||
if(HAS_TRAIT(owner, TRAIT_CULT_HALO) && !HAS_TRAIT(dead_mob, TRAIT_CULT_HALO))
|
||||
// When cultists get halos, they stop caring about death
|
||||
mood_change *= -0.5
|
||||
|
||||
@@ -231,7 +231,7 @@
|
||||
return ..()
|
||||
|
||||
/datum/heretic_knowledge/limited_amount/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc)
|
||||
var/datum/antagonist/heretic/our_heretic = IS_HERETIC(user)
|
||||
var/datum/antagonist/heretic/our_heretic = GET_HERETIC(user)
|
||||
if(our_heretic && our_heretic.unlimited_blades)
|
||||
if(length(result_atoms & typesof(/obj/item/melee/sickly_blade)))
|
||||
return TRUE
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
return .
|
||||
|
||||
/obj/item/melee/sickly_blade/attack_self(mob/user)
|
||||
var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user)
|
||||
var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user)
|
||||
if(heretic_datum?.unlimited_blades)
|
||||
return
|
||||
if(HAS_TRAIT(user, TRAIT_ELDRITCH_ARENA_PARTICIPANT))
|
||||
@@ -168,7 +168,7 @@
|
||||
. = ..()
|
||||
if(!infused || target == user || !isliving(target))
|
||||
return
|
||||
var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user)
|
||||
var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user)
|
||||
var/mob/living/living_target = target
|
||||
if(!heretic_datum)
|
||||
return
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
REMOVE_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT)
|
||||
|
||||
for(var/mob/living/carbon/human/human_in_range in view(local_user))
|
||||
if(IS_HERETIC_OR_MONSTER(human_in_range) || human_in_range.is_blind())
|
||||
if(IS_HERETIC_OR_MONSTER(human_in_range) || human_in_range.stat > SOFT_CRIT || human_in_range.is_blind())
|
||||
continue
|
||||
|
||||
if(human_in_range.can_block_magic(MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND))
|
||||
|
||||
@@ -69,6 +69,7 @@
|
||||
avatar.fully_replace_character_name(newname = alias)
|
||||
|
||||
update_avatar_id()
|
||||
avatar.mind.set_assigned_role(SSjob.get_job_type(/datum/job/bit_avatar))
|
||||
|
||||
for(var/skill_type in old_mind.known_skills)
|
||||
avatar.mind.set_experience(skill_type, old_mind.get_skill_exp(skill_type), silent = TRUE)
|
||||
|
||||
@@ -39,3 +39,6 @@
|
||||
uniform = /obj/item/clothing/under/rank/cargo/bitrunner
|
||||
belt = /obj/item/modular_computer/pda/bitrunner
|
||||
ears = /obj/item/radio/headset/headset_cargo
|
||||
|
||||
/datum/job/bit_avatar
|
||||
title = "Bit Avatar"
|
||||
|
||||
@@ -145,17 +145,16 @@
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/machinery/quantum_server/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
|
||||
. = ..()
|
||||
|
||||
if(!istype(weapon, /obj/item/bitrunning_debug))
|
||||
return
|
||||
/obj/machinery/quantum_server/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
|
||||
if(!istype(tool, /obj/item/bitrunning_debug))
|
||||
return NONE
|
||||
|
||||
balloon_alert(user, "*hacker voice* i'm in")
|
||||
obj_flags |= EMAGGED
|
||||
glitch_chance = 0.5
|
||||
capacitor_coefficient = 0.1
|
||||
points = 100
|
||||
|
||||
return ITEM_INTERACT_SUCCESS
|
||||
|
||||
/obj/machinery/quantum_server/crowbar_act(mob/living/user, obj/item/crowbar)
|
||||
. = NONE
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
if(antag)
|
||||
spawned_mob.mind.add_antag_datum(/datum/antagonist/domain_ghost_actor)
|
||||
spawned_mob.mind.set_assigned_role(SSjob.get_job_type(/datum/job/bitrunning_glitch))
|
||||
|
||||
/// Simulates a ghost role spawn without calling special(), ie a bitrunner spawn instead of a ghost.
|
||||
/obj/effect/mob_spawn/ghost_role/human/virtual_domain/proc/artificial_spawn(mob/living/runner)
|
||||
|
||||
234
code/modules/bitrunning/virtual_domain/domains/heretic_hunt.dm
Normal file
234
code/modules/bitrunning/virtual_domain/domains/heretic_hunt.dm
Normal file
@@ -0,0 +1,234 @@
|
||||
/datum/lazy_template/virtual_domain/heretic_hunt
|
||||
name = "Heretical Hunt"
|
||||
cost = BITRUNNER_COST_LOW
|
||||
desc = "Betray your fellow man to achieve ultimate power."
|
||||
difficulty = BITRUNNER_DIFFICULTY_LOW
|
||||
help_text = "Heretics require sacrifice to fuel their dark rituals - bring corpses back to the ritual site! \
|
||||
Corpses of higher ranking crew members are more valuable and may be holding useful equipment."
|
||||
forced_outfit = /datum/outfit/virtual_domain_heretic
|
||||
key = "heretic_hunt"
|
||||
map_name = "heretic_hunt"
|
||||
reward_points = BITRUNNER_REWARD_LOW
|
||||
|
||||
/datum/lazy_template/virtual_domain/heretic_hunt/setup_domain(list/created_atoms)
|
||||
for(var/mob/living/basic/fake_crewman/target in created_atoms)
|
||||
RegisterSignal(target, COMSIG_LIVING_DROPPED_LOOT, PROC_REF(on_body_spawned))
|
||||
|
||||
for(var/mob/living/basic/heretic_summon/helper in created_atoms)
|
||||
helper.ai_controller = new /datum/ai_controller/basic_controller/simple/simple_hostile(helper)
|
||||
helper.ai_controller.blackboard[BB_BASIC_MOB_IDLE_WALK_CHANCE] = 0.1
|
||||
|
||||
var/obj/effect/heretic_rune/big/rune = locate() in created_atoms
|
||||
rune.set_greyscale(pick(assoc_to_values(GLOB.heretic_path_to_color)))
|
||||
|
||||
/datum/lazy_template/virtual_domain/heretic_hunt/proc/on_body_spawned(mob/living/source, list/loot, gibbed)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(gibbed)
|
||||
return
|
||||
|
||||
for(var/mob/living/carbon/human/body in loot)
|
||||
RegisterSignal(body, COMSIG_MOVABLE_MOVED, PROC_REF(check_loc))
|
||||
// let's be safe
|
||||
for(var/obj/item/modular_computer/pda/pda in body.get_all_gear())
|
||||
qdel(pda)
|
||||
|
||||
/datum/lazy_template/virtual_domain/heretic_hunt/proc/check_loc(mob/living/carbon/human/source, ...)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
var/obj/effect/heretic_rune/big/rune = locate() in source.loc
|
||||
if(isnull(rune))
|
||||
return
|
||||
|
||||
var/datum/job/fake_job = SSjob.get_job(source.job) || SSjob.get_job_type(/datum/job/unassigned)
|
||||
// 10 points are needed
|
||||
if(fake_job.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND)
|
||||
add_points(3)
|
||||
else if(fake_job.departments_bitflags & DEPARTMENT_BITFLAG_SECURITY)
|
||||
add_points(2)
|
||||
else
|
||||
add_points(1)
|
||||
// cleanup
|
||||
source.gib(ALL)
|
||||
|
||||
// mimic a ritual effect
|
||||
if(locate(/obj/structure/closet/crate/secure/bitrunning/encrypted) in range(1, rune))
|
||||
rune.balloon_alert_to_viewers("ritual completed")
|
||||
else
|
||||
rune.balloon_alert_to_viewers("sacrifice accepted")
|
||||
flick("[rune.icon_state]_active", rune)
|
||||
playsound(rune, 'sound/effects/magic/castsummon.ogg', 50, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_exponent = 10, ignore_walls = FALSE)
|
||||
|
||||
/datum/outfit/virtual_domain_heretic
|
||||
name = "Virtual Domain Heretic"
|
||||
|
||||
// this gear is just given to them in the safehouse
|
||||
// suit = /obj/item/clothing/suit/hooded/cultrobes/eldritch
|
||||
// suit_store = /obj/item/melee/sickly_blade
|
||||
|
||||
// otherwise just thematically appropriate clothing
|
||||
uniform = /obj/item/clothing/under/color/black
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
neck = /obj/item/clothing/neck/heretic_focus
|
||||
mask = /obj/item/clothing/mask/madness_mask
|
||||
|
||||
/datum/outfit/virtual_domain_heretic/pre_equip(mob/living/carbon/human/user, visuals_only)
|
||||
ADD_TRAIT(user, TRAIT_ACT_AS_HERETIC, INNATE_TRAIT)
|
||||
ADD_TRAIT(user, TRAIT_NO_TELEPORT, INNATE_TRAIT)
|
||||
user.AddElement(/datum/element/leeching_walk)
|
||||
user.faction |= FACTION_HERETIC
|
||||
|
||||
// All it does is stand there, only attacks if attacked (Manuel player)
|
||||
/datum/ai_controller/basic_controller/fake_crewman
|
||||
blackboard = list(
|
||||
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
|
||||
BB_TARGET_MINIMUM_STAT = HARD_CRIT,
|
||||
BB_REINFORCEMENTS_SAY = "Help me!",
|
||||
)
|
||||
ai_movement = /datum/ai_movement/basic_avoidance
|
||||
idle_behavior = /datum/idle_behavior/idle_random_walk/less_walking
|
||||
planning_subtrees = list(
|
||||
/datum/ai_planning_subtree/escape_captivity,
|
||||
/datum/ai_planning_subtree/call_reinforcements,
|
||||
/datum/ai_planning_subtree/target_retaliate,
|
||||
/datum/ai_planning_subtree/attack_obstacle_in_path/trooper,
|
||||
/datum/ai_planning_subtree/basic_melee_attack_subtree,
|
||||
)
|
||||
|
||||
/datum/ai_controller/basic_controller/fake_crewman/ranged
|
||||
planning_subtrees = list(
|
||||
/datum/ai_planning_subtree/escape_captivity,
|
||||
/datum/ai_planning_subtree/call_reinforcements,
|
||||
/datum/ai_planning_subtree/target_retaliate,
|
||||
/datum/ai_planning_subtree/maintain_distance,
|
||||
/datum/ai_planning_subtree/ranged_skirmish,
|
||||
/datum/ai_planning_subtree/attack_obstacle_in_path/trooper,
|
||||
/datum/ai_planning_subtree/basic_melee_attack_subtree,
|
||||
)
|
||||
|
||||
// Immediately tries to attack the player (Terry player)
|
||||
/datum/ai_controller/basic_controller/fake_crewman/instant_hostile
|
||||
planning_subtrees = list(
|
||||
/datum/ai_planning_subtree/escape_captivity,
|
||||
/datum/ai_planning_subtree/call_reinforcements,
|
||||
/datum/ai_planning_subtree/simple_find_target,
|
||||
/datum/ai_planning_subtree/attack_obstacle_in_path/trooper,
|
||||
/datum/ai_planning_subtree/basic_melee_attack_subtree,
|
||||
)
|
||||
|
||||
/datum/ai_controller/basic_controller/fake_crewman/instant_hostile/ranged
|
||||
planning_subtrees = list(
|
||||
/datum/ai_planning_subtree/escape_captivity,
|
||||
/datum/ai_planning_subtree/call_reinforcements,
|
||||
/datum/ai_planning_subtree/simple_find_target,
|
||||
/datum/ai_planning_subtree/maintain_distance,
|
||||
/datum/ai_planning_subtree/ranged_skirmish,
|
||||
/datum/ai_planning_subtree/attack_obstacle_in_path/trooper,
|
||||
/datum/ai_planning_subtree/basic_melee_attack_subtree,
|
||||
)
|
||||
|
||||
// The actual crewmate
|
||||
/mob/living/basic/fake_crewman
|
||||
name = "crewmember"
|
||||
desc = "How do you do, fellow crewmen?"
|
||||
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
|
||||
faction = list(FACTION_HOSTILE, "vdom_fake_crew")
|
||||
icon = 'icons/mob/simple/simple_human.dmi'
|
||||
gender = MALE
|
||||
basic_mob_flags = DEL_ON_DEATH
|
||||
|
||||
ai_controller = /datum/ai_controller/basic_controller/fake_crewman
|
||||
|
||||
maxHealth = 60
|
||||
health = 60
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 20
|
||||
obj_damage = 20
|
||||
armour_penetration = 10
|
||||
|
||||
attack_sound = null // autoset
|
||||
melee_damage_type = null // autoset
|
||||
|
||||
var/death_spawner = /obj/effect/mob_spawn/corpse/human
|
||||
var/obj/item/weapon = /obj/item/storage/toolbox
|
||||
|
||||
/mob/living/basic/fake_crewman/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/ai_retaliate)
|
||||
AddElement(/datum/element/death_drops, string_list(list(weapon, death_spawner)))
|
||||
var/lhand = prob(50) ? weapon : null
|
||||
var/rhand = lhand ? null : weapon
|
||||
apply_dynamic_human_appearance(src, mob_spawn_path = death_spawner, l_hand = lhand, r_hand = rhand)
|
||||
|
||||
attack_sound ||= weapon::hitsound
|
||||
melee_damage_type ||= weapon::damtype
|
||||
sharpness = weapon::sharpness
|
||||
wound_bonus = weapon::wound_bonus * 0.5
|
||||
exposed_wound_bonus = weapon::exposed_wound_bonus * 0.5
|
||||
|
||||
/mob/living/basic/fake_crewman/md
|
||||
name = "medical doctor"
|
||||
death_spawner = /obj/effect/mob_spawn/corpse/human/doctor
|
||||
weapon = /obj/item/circular_saw
|
||||
|
||||
/mob/living/basic/fake_crewman/sec
|
||||
name = "security officer"
|
||||
ai_controller = /datum/ai_controller/basic_controller/fake_crewman/instant_hostile
|
||||
death_spawner = /obj/effect/mob_spawn/corpse/human/secoff
|
||||
weapon = /obj/item/knife/combat/survival
|
||||
damage_coeff = list(BRUTE = 0.6, BURN = 0.6, TOX = 1, STAMINA = 1, OXY = 1)
|
||||
|
||||
/mob/living/basic/fake_crewman/engi
|
||||
name = "engineer"
|
||||
death_spawner = /obj/effect/mob_spawn/corpse/human/engineer
|
||||
weapon = /obj/item/weldingtool
|
||||
attack_sound = 'sound/items/tools/welder.ogg'
|
||||
melee_damage_type = BURN
|
||||
damage_coeff = list(BRUTE = 1, BURN = 0.9, TOX = 1, STAMINA = 1, OXY = 1)
|
||||
|
||||
/mob/living/basic/fake_crewman/engi/mod
|
||||
death_spawner = /obj/effect/mob_spawn/corpse/human/engineer/mod
|
||||
damage_coeff = list(BRUTE = 0.8, BURN = 0.8, TOX = 1, STAMINA = 1, OXY = 1)
|
||||
|
||||
/mob/living/basic/fake_crewman/assistant
|
||||
name = "assistant"
|
||||
ai_controller = /datum/ai_controller/basic_controller/fake_crewman/instant_hostile
|
||||
death_spawner = /obj/effect/mob_spawn/corpse/human/assistant
|
||||
weapon = /obj/item/knife/shiv
|
||||
|
||||
/mob/living/basic/fake_crewman/assistant/alt
|
||||
weapon = /obj/item/storage/toolbox/mechanical
|
||||
|
||||
/mob/living/basic/fake_crewman/boss
|
||||
name = "senior crewmember"
|
||||
maxHealth = 120
|
||||
health = 120
|
||||
melee_damage_lower = 20
|
||||
melee_damage_upper = 25
|
||||
armour_penetration = 30
|
||||
|
||||
/mob/living/basic/fake_crewman/boss/cmo
|
||||
name = "chief medical officer"
|
||||
death_spawner = /obj/effect/mob_spawn/corpse/human/cmo
|
||||
weapon = /obj/item/surgicaldrill
|
||||
|
||||
/mob/living/basic/fake_crewman/boss/ce
|
||||
name = "chief engineer"
|
||||
ai_controller = /datum/ai_controller/basic_controller/fake_crewman/ranged
|
||||
death_spawner = /obj/effect/mob_spawn/corpse/human/ce
|
||||
weapon = /obj/item/gun/energy/plasmacutter/adv
|
||||
|
||||
/mob/living/basic/fake_crewman/boss/ce/Initialize(mapload)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/ranged_attacks, /obj/item/ammo_casing/energy/plasma/adv, projectile_sound = 'sound/items/weapons/plasma_cutter.ogg', cooldown_time = 1.6 SECONDS)
|
||||
|
||||
/mob/living/basic/fake_crewman/boss/hos
|
||||
name = "head of security"
|
||||
ai_controller = /datum/ai_controller/basic_controller/fake_crewman/instant_hostile/ranged
|
||||
death_spawner = /obj/effect/mob_spawn/corpse/human/hos
|
||||
weapon = /obj/item/gun/energy/e_gun/hos
|
||||
damage_coeff = list(BRUTE = 0.6, BURN = 0.6, TOX = 1, STAMINA = 1, OXY = 1)
|
||||
|
||||
/mob/living/basic/fake_crewman/boss/hos/Initialize(mapload)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/ranged_attacks, /obj/item/ammo_casing/energy/laser, projectile_sound = 'sound/items/weapons/laser.ogg', cooldown_time = 1.2 SECONDS)
|
||||
@@ -88,3 +88,21 @@
|
||||
name = JOB_BITRUNNER
|
||||
outfit = /datum/outfit/job/bitrunner
|
||||
icon_state = "corpsecargotech"
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/cmo
|
||||
name = JOB_CHIEF_MEDICAL_OFFICER
|
||||
outfit = /datum/outfit/job/cmo
|
||||
icon_state = "corpsedoctor"
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/ce
|
||||
name = JOB_CHIEF_ENGINEER
|
||||
outfit = /datum/outfit/job/ce
|
||||
icon_state = "corpseengineer"
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/secoff
|
||||
name = JOB_SECURITY_OFFICER
|
||||
outfit = /datum/outfit/job/security
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/hos
|
||||
name = JOB_HEAD_OF_SECURITY
|
||||
outfit = /datum/outfit/job/hos
|
||||
|
||||
@@ -331,6 +331,7 @@
|
||||
spawned_human.Drain()
|
||||
else //Because for some reason I can't track down, things are getting turned into husks even if husk = false. It's in some damage proc somewhere.
|
||||
spawned_human.cure_husk()
|
||||
spawned_human.job = name
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/equip(mob/living/carbon/human/spawned_human)
|
||||
. = ..()
|
||||
|
||||
@@ -18,6 +18,9 @@ modules = ["ice.dmm"]
|
||||
[rooms.lavaland_boss]
|
||||
modules = ["lavaland_boss.dmm"]
|
||||
|
||||
[rooms.maintsafe]
|
||||
modules = ["maintsafe.dmm"]
|
||||
|
||||
[rooms.mine]
|
||||
modules = ["mine.dmm"]
|
||||
|
||||
|
||||
@@ -3807,6 +3807,7 @@
|
||||
#include "code\modules\bitrunning\virtual_domain\domains\fredingtonfastingbear.dm"
|
||||
#include "code\modules\bitrunning\virtual_domain\domains\gondola_asteroid.dm"
|
||||
#include "code\modules\bitrunning\virtual_domain\domains\grassland_hunt.dm"
|
||||
#include "code\modules\bitrunning\virtual_domain\domains\heretic_hunt.dm"
|
||||
#include "code\modules\bitrunning\virtual_domain\domains\hierophant.dm"
|
||||
#include "code\modules\bitrunning\virtual_domain\domains\island_brawl.dm"
|
||||
#include "code\modules\bitrunning\virtual_domain\domains\meta_central.dm"
|
||||
|
||||
Reference in New Issue
Block a user