Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
5b98094
wow its goku
Jacquerel Mar 6, 2024
878966a
become ape
Jacquerel Mar 7, 2024
6ac3177
Remove some stuff I didn't need actually, organ placeholders
Jacquerel Mar 7, 2024
e89ea96
don't need this either
Jacquerel Mar 7, 2024
fc9f718
miracle zenkai power
Jacquerel Mar 12, 2024
946739a
What does the scouter say?
Jacquerel Mar 12, 2024
3510499
Base powers
Jacquerel Mar 15, 2024
8a4543f
kamehameha
Jacquerel Mar 16, 2024
b9ebcea
Yajirobe's time to shine
Jacquerel Mar 16, 2024
241b321
solar flare
Jacquerel Mar 16, 2024
b0a1555
Another powerful technique
Jacquerel Mar 17, 2024
0976e57
Forgot the icon
Jacquerel Mar 17, 2024
1e697aa
super saiyan
Jacquerel Mar 17, 2024
a451623
cool ape!
Jacquerel Mar 17, 2024
c0eeed6
Dead men use no tails
Jacquerel Mar 17, 2024
1dea380
Lore reasons
Jacquerel Mar 17, 2024
499fc04
Ultra Instinct
Jacquerel Mar 30, 2024
ae462d7
add it to the list
Jacquerel Mar 31, 2024
3decdbe
Remove commented out code
Jacquerel Mar 31, 2024
a6f2379
Lint and remove debug log
Jacquerel Mar 31, 2024
4c70ed1
Superstition + screenshot
Jacquerel Mar 31, 2024
5124f87
Great Ape now benefits from any increase you had to your power level …
Jacquerel Apr 1, 2024
d9119f9
Nerf Saiyan sleeping before it hits Manuel or Sybil
Jacquerel Apr 1, 2024
f6a7d64
Firing your ki ends ultra instinct
Jacquerel Apr 1, 2024
92b390d
it compiles
ZealousZeke Jun 11, 2026
350275d
fixes one of the linter issues
ZealousZeke Jun 11, 2026
0f76cd8
test
ZealousZeke Jun 13, 2026
86ca001
anotha one
ZealousZeke Jun 13, 2026
0acae0c
test 3
ZealousZeke Jun 13, 2026
c4f6813
fixed the tail
ZealousZeke Jun 14, 2026
1bf3a7f
fixed a runtime
ZealousZeke Jun 14, 2026
046e0b7
human basic
ZealousZeke Jun 14, 2026
fc0ad91
anotha runtime down
ZealousZeke Jun 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,16 @@
///from /atom/movable/screen/alert/give/proc/handle_transfer(): (taker, item)
#define COMSIG_CARBON_ITEM_GIVEN "carbon_item_given"

/// Saiyan survived a near-death encounter
#define COMSIG_SAIYAN_SURVIVOR "miracle_zenkai_power"
/// Saiyan just lost their tail
#define COMSIG_SAIYAN_TAIL_REMOVED "saiyan_tail_removed"

/// Signal sent when you use the kaioken technique (power_multiplier)
#define COMSIG_KAIKOEN_APPLIED "kaioken_applied"
/// Signal sent when you lose the kaioken power (power_multiplier)
#define COMSIG_KAIOKEN_REMOVED "kaioken_removed"

/// Sent from /mob/living/carbon/human/handle_blood(): (seconds_per_tick, times_fired)
#define COMSIG_HUMAN_ON_HANDLE_BLOOD "human_on_handle_blood"
/// Return to prevent all default blood handling
Expand Down
1 change: 1 addition & 0 deletions code/__DEFINES/mobs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@
#define SPECIES_MUSHROOM "mush"
#define SPECIES_PLASMAMAN "plasmaman"
#define SPECIES_PODPERSON "pod"
#define SPECIES_SAIYAN "saiyan"
#define SPECIES_SHADOW "shadow"
#define SPECIES_SKELETON "skeleton"
#define SPECIES_SNAIL "snail"
Expand Down
8 changes: 8 additions & 0 deletions code/__DEFINES/traits/declarations.dm
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// "Magic" trait that blocks the mob from moving or interacting with anything. Used for transient stuff like mob transformations or incorporality in special cases.
/// Will block movement, `Life()` (!!!), and other stuff based on the mob.
#define TRAIT_NO_TRANSFORM "block_transformations"
/// I've been turned into something else
#define TRAIT_SHAPESHIFTED "shapeshifted"
/// Tracks whether we're gonna be a baby alien's mummy.
#define TRAIT_XENO_HOST "xeno_host"
/// This parrot is currently perched
Expand Down Expand Up @@ -862,6 +864,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_CONTRABAND_BLOCKER "contraband_blocker"
/// For edible items that cannot be composted inside hydro trays
#define TRAIT_UNCOMPOSTABLE "uncompostable"
/// limbs with this trait can be empowered by a saiyan heart
#define TRAIT_SAIYAN_STRENGTH "saiyan_strength"
/// Allows you to detect power levels
#define TRAIT_MARTIAL_VISION "martial_vision"
/// Are you the legendary super saiyan? If so, you are allowed to become blonde.
#define TRAIT_POWER_HAIR "thirty_dollar_haircut"

//quirk traits
#define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance"
Expand Down
4 changes: 4 additions & 0 deletions code/_globalvars/traits/_traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_MAGICALLY_PHASED" = TRAIT_MAGICALLY_PHASED,
"TRAIT_MARTIAL_ARTS_IMMUNE" = TRAIT_MARTIAL_ARTS_IMMUNE,
"TRAIT_MANSUS_TOUCHED" = TRAIT_MANSUS_TOUCHED,
"TRAIT_MARTIAL_VISION" = TRAIT_MARTIAL_VISION,
"TRAIT_MEDIBOTCOMINGTHROUGH" = TRAIT_MEDIBOTCOMINGTHROUGH,
"TRAIT_MEDICAL_HUD" = TRAIT_MEDICAL_HUD,
"TRAIT_MESON_VISION" = TRAIT_MESON_VISION,
Expand Down Expand Up @@ -430,6 +431,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_PLANT_SAFE" = TRAIT_PLANT_SAFE,
"TRAIT_PLASMA_LOVER_METABOLISM" = TRAIT_PLASMA_LOVER_METABOLISM,
"TRAIT_POSTERBOY" = TRAIT_POSTERBOY,
"TRAIT_POWER_HAIR" = TRAIT_POWER_HAIR,
"TRAIT_PRESENT_VISION" = TRAIT_PRESENT_VISION,
"TRAIT_PRESERVE_UI_WITHOUT_CLIENT" = TRAIT_PRESERVE_UI_WITHOUT_CLIENT,
"TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION" = TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION,
Expand Down Expand Up @@ -465,10 +467,12 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_ROD_SUPLEX" = TRAIT_ROD_SUPLEX,
"TRAIT_ROUGHRIDER" = TRAIT_ROUGHRIDER,
"TRAIT_SABRAGE_PRO" = TRAIT_SABRAGE_PRO,
"TRAIT_SAIYAN_STRENGTH" = TRAIT_SAIYAN_STRENGTH,
"TRAIT_SECURITY_HUD" = TRAIT_SECURITY_HUD,
"TRAIT_SEE_WORN_COLOURS" = TRAIT_SEE_WORN_COLOURS,
"TRAIT_SELF_AWARE" = TRAIT_SELF_AWARE,
"TRAIT_SETTLER" = TRAIT_SETTLER,
"TRAIT_SHAPESHIFTED" = TRAIT_SHAPESHIFTED,
"TRAIT_SHAVED" = TRAIT_SHAVED,
"TRAIT_SHIFTY_EYES" = TRAIT_SHIFTY_EYES,
"TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE,
Expand Down
5 changes: 5 additions & 0 deletions code/controllers/subsystem/sprite_accessories.dm
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity
var/list/tails_list_felinid
var/list/tails_list_lizard
var/list/tails_list_monkey
var/list/tails_list_saiyan
var/list/tails_list_fish
var/list/ears_list
var/list/wings_list
Expand All @@ -56,6 +57,7 @@ SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity
var/list/caps_list
var/list/pod_hair_list


/datum/controller/subsystem/accessories/PreInit() // this stuff NEEDS to be set up before GLOB for preferences and stuff to work so this must go here. sorry
setup_lists()
init_hair_gradients()
Expand Down Expand Up @@ -91,6 +93,7 @@ SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity
tails_list_felinid = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/felinid, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
tails_list_lizard = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard)[DEFAULT_SPRITE_LIST]
tails_list_monkey = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/monkey)[DEFAULT_SPRITE_LIST]
tails_list_saiyan = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/saiyan, add_blank = FALSE)[DEFAULT_SPRITE_LIST]
//tails fo fish organ infusions, not for prefs.
tails_list_fish = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/fish)[DEFAULT_SPRITE_LIST]
snouts_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts)[DEFAULT_SPRITE_LIST]
Expand All @@ -107,6 +110,8 @@ SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity
moth_markings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_markings, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
pod_hair_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair)[DEFAULT_SPRITE_LIST]



/// This proc just initializes all /datum/sprite_accessory/hair_gradient into an list indexed by gradient-style name
/datum/controller/subsystem/accessories/proc/init_hair_gradients()
hair_gradients_list = list()
Expand Down
8 changes: 8 additions & 0 deletions code/datums/sprite_accessories.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1811,6 +1811,14 @@
icon_state = "default"
color_src = FALSE

/datum/sprite_accessory/tails/saiyan
icon = 'icons/mob/human/species/monkey/monkey_tail.dmi'
color_src = FALSE

/datum/sprite_accessory/tails/saiyan/standard
name = "Saiyan"
icon_state = "monkey"

/datum/sprite_accessory/pod_hair
icon = 'icons/mob/human/species/podperson_hair.dmi'
em_block = TRUE
Expand Down
5 changes: 5 additions & 0 deletions code/game/atom/atom_examine.dm
Original file line number Diff line number Diff line change
Expand Up @@ -165,3 +165,8 @@
/// force_real_name will always return real_name and add (as face_name/id_name) if it doesn't match their appearance
/atom/proc/get_visible_name(add_id_name, force_real_name)
return name

/mob/living/examine(mob/user)
. = ..()
if(HAS_TRAIT(user, TRAIT_MARTIAL_VISION))
. += report_power_level()
63 changes: 63 additions & 0 deletions code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm
Original file line number Diff line number Diff line change
Expand Up @@ -197,4 +197,67 @@
. = ..()
qdel(GetComponent(/datum/component/amputating_limbs))

/// A terrifyingly powerful ape from space
/mob/living/basic/gorilla/saiyan
name = "Saiyan Great Ape"
desc = "A large and destructive ape-like creature, capable of surviving the depths of space and discharging energy beams."
unsuitable_atmos_damage = 0
unsuitable_cold_damage = 0
basic_mob_flags = DEL_ON_DEATH
ai_controller = null

/mob/living/basic/gorilla/saiyan/Initialize(mapload)
. = ..()
add_traits(list(TRAIT_MARTIAL_VISION, TRAIT_SPACEWALK), INNATE_TRAIT)
AddComponent(\
/datum/component/ranged_attacks,\
projectile_type = /obj/projectile/beam/emitter/hitscan,\
projectile_sound = 'sound/items/weapons/emitter.ogg',\
cooldown_time = 0.5 SECONDS, \
)
RegisterSignal(src, COMSIG_ATOM_AFTER_ATTACKEDBY, PROC_REF(check_tail_sever))
update_appearance(UPDATE_ICON)

/mob/living/basic/gorilla/saiyan/update_icon_state()
. = ..()
if (stat == DEAD)
return
icon_state = "great_ape"

/mob/living/basic/gorilla/saiyan/death(gibbed)
var/mob/living/corpse = get_internal_saiyan()
corpse.death()
corpse.setBruteLoss(corpse.maxHealth, TRUE, TRUE)
return ..()

/// Cut off his tail! It's the only way!
/mob/living/basic/gorilla/saiyan/proc/check_tail_sever(mob/living/target, obj/item/weapon, mob/attacker, proximity_flag, click_parameters)
SIGNAL_HANDLER
if (!proximity_flag || weapon.force < 5 || weapon.get_sharpness() != SHARP_EDGED)
return
if (!prob(3))
return
target.visible_message(span_warning("[src]'s tail falls to the ground, severed completely!"))
INVOKE_ASYNC(target, TYPE_PROC_REF(/mob, emote), "scream")

var/mob/living/carbon/saiyan = get_internal_saiyan()
if (istype(saiyan))
var/obj/item/organ/tail/saiyan_tail = saiyan.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
saiyan_tail.Remove(saiyan)
saiyan_tail.forceMove(saiyan.loc)

remove_status_effect(/datum/status_effect/shapechange_mob)
qdel(src)

/// Find our normal body or return a fake saiyan
/mob/living/basic/gorilla/saiyan/proc/get_internal_saiyan()
var/datum/status_effect/shapechange_mob/shapechange_status = has_status_effect(/datum/status_effect/shapechange_mob)
if (!isnull(shapechange_status))
return shapechange_status.caster_mob

var/mob/saiyan = new /mob/living/carbon/human/species/saiyan(loc)
saiyan.name = name
saiyan.real_name = name
return saiyan

#undef GORILLA_HANDS_LAYER
25 changes: 17 additions & 8 deletions code/modules/mob/living/basic/lavaland/brimdemon/brimbeam.dm
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
click_to_activate = TRUE
cooldown_time = 5 SECONDS
melee_cooldown_time = 0
/// How long to go on cooldown when interrupted?
var/fail_cooldown = 5 SECONDS
/// How far does our beam go?
var/beam_range = 10
/// How long does our beam last?
Expand All @@ -19,6 +21,8 @@
var/static/image/direction_overlay = image('icons/mob/simple/lavaland/lavaland_monsters.dmi', "brimdemon_telegraph_dir")
/// A list of all the beam parts.
var/list/beam_parts = list()
/// If this isn't a child of /obj/effect/brimbeam it will likely runtime
var/created_type = /obj/effect/brimbeam

/datum/action/cooldown/mob_cooldown/brimbeam/Destroy()
extinguish_laser()
Expand All @@ -35,20 +39,24 @@
var/fully_charged = do_after(owner, delay = charge_duration, target = owner)
owner.cut_overlay(direction_overlay)
if (!fully_charged)
StartCooldown()
StartCooldown(fail_cooldown)
return TRUE

if (!fire_laser())
var/static/list/fail_emotes = list("coughs.", "wheezes.", "belches out a puff of black smoke.")
owner.manual_emote(pick(fail_emotes))
StartCooldown()
on_fail()
StartCooldown(fail_cooldown)
return TRUE

do_after(owner, delay = beam_duration, target = owner, hidden = TRUE)
extinguish_laser()
StartCooldown()
return TRUE

/// Emote if fired directly into a wall
/datum/action/cooldown/mob_cooldown/brimbeam/proc/on_fail()
var/static/list/fail_emotes = list("coughs.", "wheezes.", "belches out a puff of black smoke.")
owner.manual_emote(pick(fail_emotes))

/// Create a laser in the direction we are facing
/datum/action/cooldown/mob_cooldown/brimbeam/proc/fire_laser()
owner.visible_message(span_danger("[owner] fires a brimbeam!"))
Expand All @@ -66,20 +74,20 @@
break
if(blocked)
break
var/obj/effect/brimbeam/new_brimbeam = new(affected_turf)
var/obj/effect/brimbeam/new_brimbeam = new created_type(affected_turf)
new_brimbeam.dir = owner.dir
beam_parts += new_brimbeam
new_brimbeam.assign_creator(owner)
for(var/mob/living/hit_mob in affected_turf.contents)
hit_mob.apply_damage(damage = 25, damagetype = BURN)
to_chat(hit_mob, span_userdanger("You're blasted by [owner]'s brimbeam!"))
to_chat(hit_mob, span_userdanger("You're blasted by [owner]'s beam!"))
RegisterSignal(new_brimbeam, COMSIG_QDELETING, PROC_REF(extinguish_laser)) // In case idk a singularity eats it or something
if(!length(beam_parts))
return FALSE
var/atom/last_brimbeam = beam_parts[length(beam_parts)]
last_brimbeam.icon_state = "brimbeam_end"
last_brimbeam.icon_state = "[last_brimbeam.base_icon_state]_end"
var/atom/first_brimbeam = beam_parts[1]
first_brimbeam.icon_state = "brimbeam_start"
first_brimbeam.icon_state = "[last_brimbeam.base_icon_state]_start"
return TRUE

/// Get rid of our laser when we are done with it
Expand All @@ -96,6 +104,7 @@
name = "brimbeam"
icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi'
icon_state = "brimbeam_mid"
base_icon_state = "brimbeam"
layer = ABOVE_MOB_LAYER
plane = ABOVE_GAME_PLANE
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
Expand Down
12 changes: 10 additions & 2 deletions code/modules/mob/living/basic/lavaland/watcher/watcher_gaze.dm
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,18 @@
var/image/current_overlay
/// Timer until we go to the next stage
var/stage_timer
/// Text to print upon use
var/report_started = "'s eye glows ominously!"
/// What do we report blinded people?
var/blinded_source = "piercing gaze"
/// Should we stun ourselves after?
var/stop_self = TRUE

/datum/action/cooldown/mob_cooldown/watcher_gaze/Activate(mob/living/target)
show_indicator_overlay("eye_open")
stage_timer = addtimer(CALLBACK(src, PROC_REF(show_indicator_overlay), "eye_pulse"), animation_time, TIMER_STOPPABLE)
StartCooldown(360 SECONDS, 360 SECONDS)
owner.visible_message(span_warning("[owner]'s eye glows ominously!"))
owner.visible_message(span_warning("[owner] [report_started]"))
if (do_after(owner, delay = wait_delay, target = owner))
trigger_effect()
else
Expand Down Expand Up @@ -64,6 +70,8 @@
)
flick_overlay_global(flashed_overlay, show_to = GLOB.clients, duration = animation_time)
stage_timer = addtimer(CALLBACK(src, PROC_REF(hide_eye)), animation_time, TIMER_STOPPABLE)
if (!stop_self)
return
var/mob/living/living_owner = owner
living_owner.Stun(1.5 SECONDS, ignore_canstun = TRUE)

Expand All @@ -72,7 +80,7 @@
if (!viewer.flash_act(intensity = 4, affect_silicon = TRUE, visual = TRUE, length = 3 SECONDS))
return FALSE
viewer.set_confusion_if_lower(12 SECONDS)
to_chat(viewer, span_warning("You are blinded by [owner]'s piercing gaze!"))
to_chat(viewer, span_warning("You are blinded by [owner]'s [blinded_source]!"))
return TRUE

/// Animate our effect out
Expand Down
1 change: 0 additions & 1 deletion code/modules/mob/living/brain/brain_item.dm
Original file line number Diff line number Diff line change
Expand Up @@ -462,7 +462,6 @@
/obj/item/organ/brain/lustrous/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags)
. = ..()
organ_owner.gain_trauma(/datum/brain_trauma/special/bluespace_prophet, TRAUMA_RESILIENCE_ABSOLUTE)
organ_owner.AddElement(/datum/element/tenacious)

/obj/item/organ/brain/felinid //A bit smaller than average
brain_size = 0.8
Expand Down
Loading
Loading