OVALORANT
--- SETTINGS ---
settings {
"main": {
"Description": "VALORANT Remake: 14 Agents, Spike, Economy, Maps Selection",
"Mode Name": "VALORANT: OVERWATCH"
},
"gamemodes": {
"elimination": {
"Enabled": true,
"Score to Win": 13,
"Draw After Match Time Elapses": false
}
},
"heroes": {
"all": {
"projectilespeed%": 500, # 弾速を最大化
"damagedealt%": 100,
"health%": 100,
"ability1cooldown%": 200,
"ability2cooldown%": 200
},
"mercy": {
"ability1enabled": false,
"ability2enabled": false,
"ultenabled": false
}
}
}
--- GLOBAL VARIABLES ---
globalvar PHASE # 0:Buy, 1:Action, 2:Post-Plant
globalvar SPIKEPOS
globalvar ISSPIKEPLANTED
globalvar ATTACKINGTEAM
globalvar SHOPCOSTRIFLE = 2900
--- PLAYER VARIABLES ---
playervar Credits
playervar IsFlashed
playervar AbilityCooldown
--- INITIALIZATION ---
rule "Global Setup":
@Event global
PHASE = 0
ATTACKING_TEAM = Team.1
disableAnnouncer()
# マップ選択のヒントをログに表示
# 推奨: Hanamura, Anubis, Lijiang
rule "Player Setup & HUD":
@Event eachPlayer
eventPlayer.Credits = 800
eventPlayer.setMoveSpeed(75)
eventPlayer.setMaxHealth(100)
eventPlayer.setReceiveHealing(0)
# HUD Display
createInWorldText(eventPlayer, "CREDITS: {0}".format(eventPlayer.Credits), updateEveryTick(eventPlayer.getEyePosition() + eventPlayer.getFacingDirection() * 2 + Vector.UP * 0.5), 1.5, Clipping.NONE, InWorldTextReeval.VISIBILITYPOSITIONAND_STRING, Color.GOLD, SpectatorVisibility.DEFAULT)
# ヒーロー制限 (ビーム系禁止)
if eventPlayer.getCurrentHero() in [Hero.MEI, Hero.SYMMETRA, Hero.ZARYA, Hero.WINSTON, Hero.MOIRA]:
eventPlayer.setPrimaryFireEnabled(false)
eventPlayer.smallMessage("BEAM HEROES ARE BANNED / ビーム系は禁止です")
--- STOPPING MECHANICS (Accuracy) ---
rule "Shooting Logic: Accuracy & Stopping":
@Event eachPlayer
@Condition eventPlayer.isFiring() == true
if eventPlayer.getSpeed() > 1.2:
# 走り撃ちペナルティ (Moving)
eventPlayer.setDamageDealt(30)
eventPlayer.startCameraShake(5, 0.1)
else:
# 静止撃ち (Standing Still)
if eventPlayer.getCurrentHero() == Hero.MERCY:
eventPlayer.setDamageDealt(160) # Classic (Weakest)
elif eventPlayer.getCurrentHero() == Hero.WIDOWMAKER:
eventPlayer.setDamageDealt(500) # Operator (Strongest)
elif eventPlayer.getCurrentHero() == Hero.CASSIDY:
eventPlayer.setDamageDealt(280) # Sheriff
else:
eventPlayer.setDamageDealt(240) # Vandal/Phantom
eventPlayer.stopCameraShake()
--- SMOKE SYSTEM (Controller Ability) ---
rule "Ability: Smoke (Interact F)":
@Event eachPlayer
@Condition eventPlayer.isHoldingButton(Button.INTERACT)
@Condition eventPlayer.AbilityCooldown <= 0
@Condition eventPlayer.getCurrentHero() in [Hero.ANA, Hero.BAPTISTE]
createEffect(getAllPlayers(), Effect.SPHERE, Color.GRAY, raycast(eventPlayer.getEyePosition(), eventPlayer.getEyePosition() + eventPlayer.getFacingDirection() * 25, null, null, false).getHitPosition(), 4.5, EffectReeval.VISIBILITYPOSITIONAND_RADIUS)
eventPlayer.AbilityCooldown = 25
smallMessage(eventPlayer, "SMOKE DEPLOYED / スモーク設置")
wait(12)
destroyEffect(getLastCreatedEntity())
--- FLASH SYSTEM (Duelist Ability) ---
rule "Ability: Flash (Ability 2 E)":
@Event eachPlayer
@Condition eventPlayer.isHoldingButton(Button.ABILITY_2)
@Condition eventPlayer.AbilityCooldown <= 0
@Condition eventPlayer.getCurrentHero() in [Hero.SOMBRA, Hero.KIRIKO]
foreach enemy in getPlayersInRadius(eventPlayer.getEyePosition() + eventPlayer.getFacingDirection() * 6, 12, getOppositeTeam(eventPlayer.getTeam()), RadiusLos.SURFACES):
if isInLos(eventPlayer, enemy, BarrierLos.PASSTHROUGHBARRIERS):
enemy.IsFlashed = 1.6
enemy.setPrimaryFireEnabled(false)
eventPlayer.AbilityCooldown = 20
smallMessage(eventPlayer, "FLASHING! / フラッシュ!")
rule "Flash Visual Processing":
@Event eachPlayer
@Condition eventPlayer.IsFlashed > 0
eventPlayer.startCameraShake(15, 0.1)
while eventPlayer.IsFlashed > 0:
eventPlayer.IsFlashed -= 0.1
wait(0.1)
eventPlayer.stopCameraShake()
eventPlayer.setPrimaryFireEnabled(true)
--- ECONOMY & SHOP SYSTEM ---
rule "Round Phase: Buy Phase (15s)":
@Event global
@Condition isGameInProgress()
PHASE = 0
bigMessage(getAllPlayers(), "BUY PHASE (15s) / 購入フェーズ")
wait(15)
PHASE = 1
bigMessage(getAllPlayers(), "ACTION PHASE / 開始!")
rule "Shop Logic: Purchase Rifle (R Key)":
@Event eachPlayer
@Condition PHASE == 0
@Condition eventPlayer.isHoldingButton(Button.RELOAD)
if eventPlayer.Credits >= SHOPCOSTRIFLE:
eventPlayer.Credits -= SHOPCOSTRIFLE
eventPlayer.setDamageDealt(350)
smallMessage(eventPlayer, "PURCHASED: RIFLE / 武器を購入しました")
else:
smallMessage(eventPlayer, "NOT ENOUGH CREDITS / クレジット不足")
rule "Kill Reward":
@Event playerDealtFinalBlow
eventPlayer.Credits += 200
--- SPIKE SYSTEM ---
rule "Spike Logic: Planting (F)":
@Event eachPlayer
@Condition eventPlayer.getTeam() == ATTACKING_TEAM
@Condition eventPlayer.isHoldingButton(Button.INTERACT)
@Condition PHASE == 1
smallMessage(eventPlayer, "PLANTING SPIKE... / 設置中...")
wait(4, WaitBehavior.ABORTWHENFALSE)
ISSPIKEPLANTED = true
SPIKEPOS = eventPlayer.getPosition()
PHASE = 2
bigMessage(getAllPlayers(), "SPIKE PLANTED / スパイク設置!")
createEffect(getAllPlayers(), Effect.SPHERE, Color.RED, SPIKEPOS, 1.2, EffectReeval.VISIBILITYPOSITIONAND_RADIUS)
rule "Spike Logic: Defusing (F)":
@Event eachPlayer
@Condition eventPlayer.getTeam() != ATTACKINGTEAM
@Condition ISSPIKEPLANTED == true
@Condition distance(eventPlayer.getPosition(), SPIKEPOS) < 2.5
@Condition eventPlayer.isHoldingButton(Button.INTERACT)
smallMessage(eventPlayer, "DEFUSING SPIKE... / 解除中...")
wait(7, WaitBehavior.ABORTWHENFALSE)
ISSPIKEPLANTED = false
bigMessage(getAllPlayers(), "SPIKE DEFUSED / スパイク解除完了!")
declareRoundVictory(getOppositeTeam(ATTACKING_TEAM))