much0J - 28.07.2025 v 13:19:49 -
new* editováno 28.07.2025 v 13:36:19
Malý příběh s AI a programováním
Je to už nějaký pátek, co jsem se v roce 2022 stal jedním z prvních z veřejnosti, kdo si mohl zkusit ChatGPT. Tehdy jsem prorokoval všelicos, ale ještě mi nedocházela ta šíře využití, kterou to jednou bude mít.
Dnes, 3 roky poté, musím uznat, že je to furt v plenkách. I když, teď se jeden custom model umístil na II. místě ve velké kódovací soutěži (vyhrál to nějakej polák).
Měl jsem vlastně docela triviální problém - potřeboval jsem algoritmus pro výpočet maximálního života vaší postavy. To není těžkýho, pokud nemáte ve hře různé buffy a debuffy, levelování atd., ale pokud chcete vytvořit novou mechaniku (jako např. já a status 'Madnes'), můžete narazit na problém.
Status 'Madness' by vám v současné podobě měl snížit maximální život vždy o 50%. To je jednoduchý, vezmu global.hpmax a vydělím 2. Easy Peazy. Co se ale stane, pokud mezitím, co je status aktivní, se maximální zdraví zvýší? Mno, to už udělá potíže, protože původní maximální hodnota (global.hpmax) je ta původní, ze které počítáme oněch 50%, nicméně to se teď změnilo a musíme číslo přepočítat a znova uložit, aby když se zbavíme statusu 'Madness', se nám vrátilo maximální zdraví na skutečnou podobu (včetně levelování či item buffů).
No a s tím byl problém - aniž bych zacházel do detailů, stručně, nešlo to. Potřeboval jsem jednoduchý kód, který by běžel sám, měl všechny potřebný failsafy a to bez toho, aniž bych musel šahat do jinýho kódu (např. pro levelování nebo item buffy).
Řikal jsem si, že tyhle úlohy jsou pro AI jako stvořené, přeci jen je tohle otázka matiky. Mno, po asi třech dnech a nespočtu variací a vyzkoušením různých modelů jsem se na to nakonec vysral a za půl hodiny to udělal sám. Ani jedno AI nebylo schopný to nejenom zprovoznit, ale nedovedli si poradit bez externích skriptů nebo bez nutnosti upravit i kod na levelování a item buffy (byla by nutnost kontroly stovek řádků kódu.)
Co je na tom nejvtipnější je, že kód, co jsem vymyslel, je absolutně primitivní a nepotřebuje nic navíc, žádnou úpravu, pouze dvě nové proměnné.
rozbalit ↓
// SCALE MAX HP BASED ON MADNESS STATUS
if (instance_exists(p_entity)) {
// --- If madness is active ---
if (p_entity.madness) {
// First-time activation: store original HP and halve it
if (originalHP == noone) {
originalHP = global.hpmax;
currentHP = round(originalHP / 2);
} else {
// If max HP has changed during madness, recalculate currentHP
if (global.hpmax != originalHP) {
var diff = global.hpmax - originalHP;
var updatedHP = originalHP + diff;
currentHP = round(updatedHP);
}
}
// Apply scaled HP
global.hpmax = currentHP;
} else {
// --- If madness is no longer active ---
if (originalHP != noone) {
var baseHP = currentHP * 2;
// Round up to the nearest 5 for a clean value
global.hpmax = ceil(baseHP / 5) * 5;
// Reset the originalHP marker
originalHP = noone;
}
}
}