Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
3c8a649
Coggers
tymurshatillo Apr 11, 2022
9c31c5b
Update space_dragon.dm
Apr 12, 2022
af21da0
Update code/modules/events/space_dragon.dm
Apr 17, 2022
e4ee1c6
Update space_dragon.dm
Apr 17, 2022
9a2dcd5
Update space_dragon.dm
Apr 17, 2022
92f65fd
Update code/modules/events/space_dragon.dm
JamieD1 Apr 21, 2022
f31900d
Merge branch 'master' into Sussy_Spessdragon
JamieD1 Apr 24, 2022
8c739ec
Merge branch 'master' into Sussy_Spessdragon
Apr 26, 2022
62098b5
Work normally please
May 18, 2022
cfcb351
Update space_dragon.dm
May 18, 2022
f4b77bd
Update space_dragon.dm
May 18, 2022
b5b2397
Update space_dragon.dm
May 18, 2022
a78c762
Update space_dragon.dm
May 18, 2022
733929b
Update space_dragon.dm
May 18, 2022
fde8419
Update code/modules/mob/living/simple_animal/hostile/space_dragon.dm
May 18, 2022
8586162
Update space_dragon.dm
May 19, 2022
8679577
Update space_dragon.dm
May 19, 2022
1b13159
Update space_dragon.dm
May 19, 2022
415ca20
Update space_dragon.dm
May 19, 2022
e6053e6
Update space_dragon.dm
May 19, 2022
f5dea2e
Update code/modules/mob/living/simple_animal/hostile/space_dragon.dm
May 19, 2022
a39e844
Update space_dragon.dm
May 19, 2022
681e416
Update space_dragon.dm
May 19, 2022
6cfd823
Update space_dragon.dm
May 19, 2022
4df8df7
Update code/modules/mob/living/simple_animal/hostile/space_dragon.dm
May 19, 2022
31e2a5e
Update space_dragon.dm
May 20, 2022
45a1f7c
Update space_dragon.dm
May 20, 2022
7b1c980
Update space_dragon.dm
May 20, 2022
57c6e4b
Update space_dragon.dm
May 20, 2022
79f290c
Carpdragon hide
May 20, 2022
1076f4f
Update code/modules/antagonists/space_dragon/space_dragon.dm
Jun 15, 2022
e7d9fe5
Update code/modules/antagonists/space_dragon/space_dragon.dm
Jun 15, 2022
44be887
Update code/modules/antagonists/space_dragon/space_dragon.dm
Jun 15, 2022
170b20b
Update code/modules/events/space_dragon.dm
Jun 15, 2022
6748972
Update code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
Jun 15, 2022
428eede
Update space_dragon.dm
Jun 27, 2022
5f56bf6
#61539
Jun 27, 2022
0ac81e1
Update animal_defense.dm
Jun 27, 2022
97aa425
Merge branch 'master' into Sussy_Spessdragon
Jun 27, 2022
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
2 changes: 2 additions & 0 deletions code/__DEFINES/role_preferences.dm
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
#define ROLE_VAMPIRICACCIDENT "Vampiric Accident"
#define ROLE_BLOODSUCKERBREAKOUT "Bloodsucker Breakout"
#define ROLE_MONSTERHUNTER "Monster Hunter"
#define ROLE_SPACE_DRAGON "Space Dragon"
#define ROLE_GOLEM "Golem"
#define ROLE_SINFULDEMON "Demon of Sin"

Expand Down Expand Up @@ -93,6 +94,7 @@ GLOBAL_LIST_INIT(special_roles, list(
ROLE_FUGITIVE,
ROLE_BLOODSUCKER = /datum/game_mode/bloodsucker,
ROLE_MONSTERHUNTER,
ROLE_SPACE_DRAGON,
ROLE_SINFULDEMON
))

Expand Down
46 changes: 46 additions & 0 deletions code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
Original file line number Diff line number Diff line change
Expand Up @@ -498,6 +498,52 @@
log_game("DYNAMIC: [key_name(S)] was spawned as a Nightmare by the midround ruleset.")
return S



//////////////////////////////////////////////
// //
// SPACE DRAGON (GHOST) //
// //
//////////////////////////////////////////////

/datum/dynamic_ruleset/midround/from_ghosts/space_dragon
name = "Space Dragon"
antag_datum = /datum/antagonist/space_dragon
antag_flag = "Space Dragon"
antag_flag_override = ROLE_SPACE_DRAGON
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
required_candidates = 1
weight = 4
cost = 10
requirements = list(101,101,101,80,60,50,30,20,10,10)
repeatable = TRUE
var/list/spawn_locs = list()

/datum/dynamic_ruleset/midround/from_ghosts/space_dragon/execute()
for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list)
spawn_locs += (C.loc)
if(!spawn_locs.len)
message_admins("No valid spawn locations found, aborting...")
return MAP_ERROR
. = ..()

/datum/dynamic_ruleset/midround/from_ghosts/space_dragon/generate_ruleset_body(mob/applicant)
var/datum/mind/player_mind = new /datum/mind(applicant.key)
player_mind.active = TRUE

var/mob/living/simple_animal/hostile/space_dragon/S = new (pick(spawn_locs))
player_mind.transfer_to(S)
player_mind.assigned_role = "Space Dragon"
player_mind.special_role = "Space Dragon"
player_mind.add_antag_datum(/datum/antagonist/space_dragon)

playsound(S, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1)
message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Space Dragon by the midround ruleset.")
log_game("DYNAMIC: [key_name(S)] was spawned as a Space Dragon by the midround ruleset.")
priority_announce("A large organic energy flux has been recorded in the vicinity of [station_name()], please stand-by.", "Lifesign Alert")
return S

//////////////////////////////////////////////
// //
// VAMPIRE //
Expand Down
63 changes: 41 additions & 22 deletions code/modules/antagonists/space_dragon/space_dragon.dm
Original file line number Diff line number Diff line change
@@ -1,32 +1,51 @@
/datum/antagonist/space_dragon
name = "Space Dragon"
show_in_antagpanel = FALSE
roundend_category = "space dragons"
antagpanel_category = "Space Dragon"
job_rank = ROLE_SPACE_DRAGON
show_in_antagpanel = TRUE
show_name_in_check_antagonists = TRUE
show_to_ghosts = TRUE
var/list/datum/mind/carp = list()

/datum/antagonist/space_dragon/greet()
to_chat(owner, "<b>I am Space Dragon, ex-space carp, and defender of the secrets of constellation, Draco.</b>")
to_chat(owner, "<b>Fabulous secret powers were revealed to me the day I held aloft a wizard's staff of change and said 'By the power of Draco, I have the power!'</b>")
to_chat(owner, "<b>The wizard was turned into the short-lived Pastry Cat while I became Space Dragon, the most powerful beast in the universe.</b>")
to_chat(owner, "<b>Clicking a tile will shoot fire onto that tile.</b>")
to_chat(owner, "<b>Using Tail Sweep will let me get the better of those who come too close.</b>")
to_chat(owner, "<b>Attacking dead bodies will allow me to gib them to restore health.</b>")
to_chat(owner, "<b>From the wizard's writings, he had been studying this station and its hierarchy. From this, I know who leads the station, and will kill them so the station underlings see me as their new leader.</b>")
to_chat(owner, "<b>Endless time and space we have moved through. We do not remember from where we came, we do not know where we will go. All space belongs to us.\n\
Space is an empty void, in which our kind is the apex predator, and there is little to rival our claim to this title.\n\
But now, we find intruders spread out amongst our claim! They are willing to fight our teeth with magics unimaginable, in their strange metal dens flickering in the depths of space.\n\
Today, we will remind them of our power.</b>")
to_chat(owner, "<span class='boldwarning'>You have five minutes to find a safe location to place down the first rift. If you take longer than five minutes to place a rift, you will be returned from whence you came.</span>")
owner.announce_objectives()
SEND_SOUND(owner.current, sound('sound/magic/demon_attack1.ogg'))

/datum/antagonist/space_dragon/proc/forge_objectives()
var/current_heads = SSjob.get_all_heads()
var/datum/objective/assassinate/killchosen = new
killchosen.owner = owner
var/datum/mind/selected = pick(current_heads)
killchosen.target = selected
killchosen.update_explanation_text()
objectives += killchosen
var/datum/objective/survive/survival = new
survival.owner = owner
objectives += survival

var/datum/objective/summon_carp/summon = new()
summon.dragon = src
objectives += summon

/datum/antagonist/space_dragon/on_gain()
forge_objectives()
. = ..()
. = ..()

/datum/objective/summon_carp
var/datum/antagonist/space_dragon/dragon
explanation_text = "Summon and protect the rifts to flood the station with carp."

/datum/antagonist/space_dragon/roundend_report()
var/list/parts = list()
var/datum/objective/summon_carp/S = locate() in objectives
if(S.check_completion())
parts += "<span class='redtext big'>The [name] has succeeded! Station space has been reclaimed by the space carp!</span>"
parts += printplayer(owner)
var/objectives_complete = TRUE
if(objectives.len)
parts += printobjectives(objectives)
for(var/datum/objective/objective in objectives)
if(!objective.check_completion())
objectives_complete = FALSE
break
if(objectives_complete)
parts += "<span class='greentext big'>The [name] was successful!</span>"
else
parts += "<span class='redtext big'>The [name] has failed!</span>"
parts += "<span class='header'>The [name] was assisted by:</span>"
parts += printplayerlist(carp)
return "<div class='panel redborder'>[parts.Join("<br>")]</div>"
12 changes: 5 additions & 7 deletions code/modules/events/space_dragon.dm
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,20 @@
name = "Spawn Space Dragon"
typepath = /datum/round_event/ghost_role/space_dragon
max_occurrences = 1
weight = 8
earliest_start = 70 MINUTES
weight = 5
earliest_start = 60 MINUTES
min_players = 30
dynamic_should_hijack = TRUE

/datum/round_event/ghost_role/space_dragon
minimum_required = 1
role_name = "Space Dragon"
announceWhen = 10

/datum/round_event/ghost_role/space_dragon/announce(fake)
priority_announce("It appears a lifeform with magical traces is approaching [station_name()], please stand-by.", "Lifesign Alert")
priority_announce("A large organic energy flux has been recorded in the vicinity of [station_name()], please stand-by.", "Lifesign Alert")

/datum/round_event/ghost_role/space_dragon/spawn_role()
var/list/candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN)
var/list/candidates = get_candidates(ROLE_SPACE_DRAGON, null, ROLE_SPACE_DRAGON)
if(!candidates.len)
return NOT_ENOUGH_PLAYERS

Expand All @@ -32,7 +31,7 @@
message_admins("No valid spawn locations found, aborting...")
return MAP_ERROR

var/mob/living/simple_animal/hostile/megafauna/dragon/space_dragon/S = new ((pick(spawn_locs)))
var/mob/living/simple_animal/hostile/space_dragon/S = new (pick(spawn_locs))
player_mind.transfer_to(S)
player_mind.assigned_role = "Space Dragon"
player_mind.special_role = "Space Dragon"
Expand All @@ -42,4 +41,3 @@
log_game("[key_name(S)] was spawned as a Space Dragon by an event.")
spawned_mobs += S
return SUCCESSFUL_SPAWN

41 changes: 27 additions & 14 deletions code/modules/mob/living/simple_animal/animal_defense.dm
Original file line number Diff line number Diff line change
Expand Up @@ -133,25 +133,38 @@
..()
if(QDELETED(src))
return
var/bomb_armor = getarmor(null, BOMB)
switch (severity)
if (EXPLODE_DEVASTATE)
if(prob(bomb_armor))
adjustBruteLoss(500)
else
gib()
return
ex_act_devastate()
if (EXPLODE_HEAVY)
var/bloss = 60
if(prob(bomb_armor))
bloss = bloss / 1.5
adjustBruteLoss(bloss)
ex_act_heavy()

if (EXPLODE_LIGHT)
var/bloss = 30
if(prob(bomb_armor))
bloss = bloss / 1.5
adjustBruteLoss(bloss)
ex_act_light()

/// Called when a devastating explosive acts on this mob
/mob/living/simple_animal/proc/ex_act_devastate()
var/bomb_armor = getarmor(null, BOMB)
if(prob(bomb_armor))
adjustBruteLoss(500)
else
gib()

/// Called when a heavy explosive acts on this mob
/mob/living/simple_animal/proc/ex_act_heavy()
var/bomb_armor = getarmor(null, BOMB)
var/bloss = 60
if(prob(bomb_armor))
bloss = bloss / 1.5
adjustBruteLoss(bloss)

/// Called when a light explosive acts on this mob
/mob/living/simple_animal/proc/ex_act_light()
var/bomb_armor = getarmor(null, BOMB)
var/bloss = 30
if(prob(bomb_armor))
bloss = bloss / 1.5
adjustBruteLoss(bloss)

/mob/living/simple_animal/blob_act(obj/structure/blob/B)
adjustBruteLoss(20)
Expand Down
73 changes: 0 additions & 73 deletions code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
Original file line number Diff line number Diff line change
Expand Up @@ -606,76 +606,3 @@ Difficulty: Medium
lava_pools(10, 2) // less pools but longer delay before spawns
player_cooldown = world.time + 200 // needs seperate cooldown or cant use fire attacks

/mob/living/simple_animal/hostile/megafauna/dragon/space_dragon
name = "space dragon"
maxHealth = 250
health = 250
faction = list("neutral")
desc = "A space carp turned dragon by vile magic. Has the same ferocity of a space carp, but also a much more enabling body."
icon = 'icons/mob/spacedragon.dmi'
icon_state = "spacedragon"
icon_living = "spacedragon"
icon_dead = "spacedragon_dead"
obj_damage = 80
melee_damage_upper = 35
melee_damage_lower = 35
speed = 0
mouse_opacity = MOUSE_OPACITY_ICON
loot = list()
crusher_loot = list()
butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30)
guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/carpdragon = 10)
move_force = MOVE_FORCE_NORMAL
move_resist = MOVE_FORCE_NORMAL
pull_force = MOVE_FORCE_NORMAL
environment_smash = ENVIRONMENT_SMASH_WALLS
deathmessage = "screeches as its wings turn to dust and it collapses on the floor, life estinguished."
attack_action_types = list()
small_sprite_type = /datum/action/small_sprite/megafauna/spacedragon
music_component = null

/mob/living/simple_animal/hostile/megafauna/dragon/space_dragon/Initialize()
var/obj/effect/proc_holder/spell/aoe_turf/repulse/spacedragon/repulse_action = new /obj/effect/proc_holder/spell/aoe_turf/repulse/spacedragon(src)
repulse_action.action.Grant(src)
mob_spell_list += repulse_action
. = ..()

/mob/living/simple_animal/hostile/megafauna/dragon/space_dragon/proc/fire_stream(var/atom/at = target)
playsound(get_turf(src),'sound/magic/fireball.ogg', 200, 1)
SLEEP_CHECK_DEATH(0)
var/range = 20
var/list/turfs = list()
turfs = line_target(0, range, at)
INVOKE_ASYNC(src, .proc/fire_line, turfs)

/mob/living/simple_animal/hostile/megafauna/dragon/space_dragon/OpenFire()
if(swooping)
return
ranged_cooldown = world.time + ranged_cooldown_time
fire_stream()

/obj/effect/proc_holder/spell/aoe_turf/repulse/spacedragon
name = "Tail Sweep"
desc = "Throw back attackers with a sweep of your tail."
sound = 'sound/magic/tail_swing.ogg'
charge_max = 200
clothes_req = FALSE
antimagic_allowed = TRUE
range = 1
cooldown_min = 200
invocation_type = "none"
sparkle_path = /obj/effect/temp_visual/dir_setting/tailsweep
action_icon = 'icons/mob/actions/actions_xeno.dmi'
action_icon_state = "tailsweep"
action_background_icon_state = "bg_alien"
anti_magic_check = FALSE

/obj/effect/proc_holder/spell/aoe_turf/repulse/spacedragon/cast(list/targets,mob/user = usr)
if(iscarbon(user))
var/mob/living/carbon/C = user
playsound(C.loc,'sound/effects/hit_punch.ogg', 80, 1, 1)
C.spin(6,1)
..(targets, user, 60)

/mob/living/simple_animal/hostile/megafauna/dragon/space_dragon/AltClickOn(atom/movable/A)
return
Loading