Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Split libcampaign into multiple files.
- Loading branch information
Showing
19 changed files
with
4,157 additions
and
4,106 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
200 changes: 200 additions & 0 deletions
200
data/base/script/campaign/libcampaign_includes/artifact.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,200 @@ | ||
|
||
//////////////////////////////////////////////////////////////////////////////// | ||
// Artifacts management. | ||
//////////////////////////////////////////////////////////////////////////////// | ||
|
||
//;; ## camSetArtifacts(artifacts) | ||
//;; | ||
//;; Tell ```libcampaign.js``` to manage a certain set of artifacts. | ||
//;; The argument is a JavaScript map from object labels to artifact | ||
//;; description. If the label points to a game object, artifact will be | ||
//;; placed when this object is destroyed; if the label is a position, the | ||
//;; artifact will be placed instantly. Artifact description is a JavaScript | ||
//;; object with the following fields: | ||
//;; | ||
//;; * ```tech``` The technology to grant when the artifact is recovered. | ||
//;; Note that this can be made into an array to make artifacts give out | ||
//;; more than one technology, if desired. | ||
//;; On __let me win__ cheat, all technologies stored in the artifacts | ||
//;; managed by this function are automatically granted. | ||
//;; Additionally, this function would call special event callbacks if they are | ||
//;; defined in your script, which should be named as follows, | ||
//;; where LABEL is the artifact label: | ||
//;; * ```camArtifactPickup_LABEL``` Called when the player picks up | ||
//;; the artifact. | ||
//;; | ||
function camSetArtifacts(artifacts) | ||
{ | ||
__camArtifacts = artifacts; | ||
for (var alabel in __camArtifacts) | ||
{ | ||
var ai = __camArtifacts[alabel]; | ||
var pos = camMakePos(alabel); | ||
if (camDef(pos.id)) | ||
{ | ||
// will place when object with this id is destroyed | ||
ai.id = "" + pos.id; | ||
ai.placed = false; | ||
} | ||
else | ||
{ | ||
// received position or area, place immediately | ||
var acrate = addFeature("Crate", pos.x, pos.y); | ||
addLabel(acrate, __camGetArtifactLabel(alabel)); | ||
ai.placed = true; | ||
} | ||
} | ||
} | ||
|
||
//;; ## camAllArtifactsPickedUp() | ||
//;; | ||
//;; Returns true if all artifacts managed by ```libcampaign.js``` | ||
//;; were picked up. | ||
//;; | ||
function camAllArtifactsPickedUp() | ||
{ | ||
// FIXME: O(n) lookup here | ||
return __camNumArtifacts === Object.keys(__camArtifacts).length; | ||
} | ||
|
||
//Returns the label of all existing artifacts | ||
function camGetArtifacts() | ||
{ | ||
var camArti = []; | ||
for (var alabel in __camArtifacts) | ||
{ | ||
if (camDef(__camArtifacts[alabel])) | ||
{ | ||
if (getObject(__camGetArtifactLabel(alabel))) | ||
{ | ||
camArti.push(__camGetArtifactLabel(alabel)); | ||
} | ||
else | ||
{ | ||
camArti.push(alabel); | ||
} | ||
} | ||
} | ||
return camArti; | ||
} | ||
|
||
//////////// privates | ||
|
||
function __camGetArtifactLabel(alabel) | ||
{ | ||
return alabel + "_artifact_label"; | ||
} | ||
|
||
function __camGetArtifactKey(objlabel) | ||
{ | ||
return objlabel.replace("_artifact_label", ""); | ||
} | ||
|
||
// called from eventDestroyed | ||
function __camCheckPlaceArtifact(obj) | ||
{ | ||
// FIXME: O(n) lookup here | ||
var alabel = getLabel(obj); | ||
if (!camDef(alabel) || !alabel) | ||
{ | ||
return; | ||
} | ||
var ai = __camArtifacts[alabel]; | ||
if (!camDef(ai)) | ||
{ | ||
return; | ||
} | ||
if (ai.placed) | ||
{ | ||
camDebug("Object to which artifact", alabel, "is bound has died twice"); | ||
return; | ||
} | ||
if (ai.tech instanceof Array) | ||
{ | ||
camTrace("Placing multi-tech granting artifact"); | ||
for (var i = 0; i < ai.tech.length; ++i) | ||
{ | ||
camTrace(i, ":", ai.tech[i]); | ||
} | ||
} | ||
else | ||
{ | ||
camTrace("Placing", ai.tech); | ||
} | ||
var acrate = addFeature("Crate", obj.x, obj.y); | ||
addLabel(acrate, __camGetArtifactLabel(alabel)); | ||
ai.placed = true; | ||
} | ||
|
||
function __camPickupArtifact(artifact) | ||
{ | ||
if (artifact.stattype !== ARTIFACT) | ||
{ | ||
camDebug("Not an artifact"); | ||
return; | ||
} | ||
// FIXME: O(n) lookup here | ||
var alabel = __camGetArtifactKey(getLabel(artifact)); | ||
var ai = __camArtifacts[alabel]; | ||
if (!camDef(alabel) || !alabel || !camDef(ai)) | ||
{ | ||
camTrace("Artifact", artifact.id, "is not managed"); | ||
return; | ||
} | ||
|
||
camTrace("Picked up", ai.tech); | ||
playSound("pcv352.ogg", artifact.x, artifact.y, artifact.z); | ||
// artifacts are not self-removing... | ||
camSafeRemoveObject(artifact); | ||
if (ai.tech instanceof Array) | ||
{ | ||
for (var i = 0; i < ai.tech.length; ++i) | ||
{ | ||
enableResearch(ai.tech[i]); | ||
} | ||
} | ||
else | ||
{ | ||
enableResearch(ai.tech); | ||
} | ||
// bump counter before the callback, so that it was | ||
// actual during the callback | ||
++__camNumArtifacts; | ||
var callback = __camGlobalContext()["camArtifactPickup_" + alabel]; | ||
if (camDef(callback)) | ||
{ | ||
callback(); | ||
} | ||
} | ||
|
||
function __camLetMeWinArtifacts() | ||
{ | ||
for (var alabel in __camArtifacts) | ||
{ | ||
var ai = __camArtifacts[alabel]; | ||
if (ai.placed) | ||
{ | ||
var label = __camGetArtifactLabel(alabel); | ||
var artifact = getObject(label); | ||
if (!camDef(artifact) || !artifact) | ||
{ | ||
continue; | ||
} | ||
__camPickupArtifact(artifact); | ||
} | ||
else | ||
{ | ||
if (ai.tech instanceof Array) | ||
{ | ||
for (var i = 0; i < ai.tech.length; ++i) | ||
{ | ||
enableResearch(ai.tech[i]); | ||
} | ||
} | ||
else | ||
{ | ||
enableResearch(ai.tech); | ||
} | ||
} | ||
} | ||
} |
Oops, something went wrong.