/* * User wants to remove the artefact from a cave or another user just robbed * that user. Remove the effects (actually same as apply_effects but with a * "-" instead of the "+"). */ void remove_effects_from_cave (db_t *database, int artefactID) { struct Artefact artefact; struct Artefact_class artefact_class; dstring_t *ds = dstring_new("UPDATE Cave SET "); int i; /* get artefact values; throws exception, if that artefact is missing */ get_artefact_by_id(database, artefactID, &artefact); /* get artefactClass; throws exception, if that artefactClass is missing */ get_artefact_class_by_id(database, artefact.artefactClassID, &artefact_class); /* Wenn das Artefakt nicht mehr eingeweiht ist, m�ssen die Effekte nicht mehr entfernt werden. */ if (artefact.initiated != ARTEFACT_INITIATED) return; for (i = 0; i < MAX_EFFECT; ++i) dstring_append(ds, "%s %s = %s - %f", (i == 0 ? "" : ","), effect_type[i]->dbFieldName, effect_type[i]->dbFieldName, artefact_class.effect[i]); dstring_append(ds, " WHERE caveID = %d", artefact.caveID); db_query_dstring(database, ds); debug(DEBUG_ARTEFACT, "remove_effects_from_cave: %s", dstring_str(ds)); }
/* * Status already set to ARTEFACT_INITIATED, now apply the effects. */ void apply_effects_to_cave (db_t *database, int artefactID) { struct Artefact artefact; struct Artefact_class artefact_class; dstring_t *ds = dstring_new("UPDATE Cave SET "); int i; /* get artefact values; throws exception, if that artefact is missing */ get_artefact_by_id(database, artefactID, &artefact); /* get artefactClass; throws exception, if that artefactClass is missing */ get_artefact_class_by_id(database, artefact.artefactClassID, &artefact_class); /* Bedingung: muss eingeweiht sein */ if (artefact.initiated != ARTEFACT_INITIATED) throw(BAD_ARGUMENT_EXCEPTION, "initiate_artefact: artefact was not initiated"); for (i = 0; i < MAX_EFFECT; ++i) dstring_append(ds, "%s %s = %s + %f", (i == 0 ? "" : ","), effect_type[i]->dbFieldName, effect_type[i]->dbFieldName, artefact_class.effect[i]); dstring_append(ds, " WHERE caveID = %d", artefact.caveID); db_query_dstring(database, ds); debug(DEBUG_ARTEFACT, "apply_effects_to_cave: %s", dstring_str(ds)); }
/* * Initiating finished. Now set the status of the artefact to * ARTEFACT_INITIATED. */ void initiate_artefact (db_t *database, int artefactID) { struct Artefact artefact; dstring_t *ds; /* get artefact values; throws exception, if that artefact is missing */ get_artefact_by_id(database, artefactID, &artefact); /* Bedingung: muss gerade eingeweiht werden */ if (artefact.initiated != ARTEFACT_INITIATING) throw(BAD_ARGUMENT_EXCEPTION, "initiate_artefact: artefact was not initiating"); /* Bedingung: muss in einer Höhle liegen */ if (artefact.caveID == 0) throw(BAD_ARGUMENT_EXCEPTION, "initiate_artefact: artefact was not in a cave"); ds = dstring_new("UPDATE " DB_TABLE_ARTEFACT " SET initiated = %d WHERE artefactID = %d AND caveID = %d", ARTEFACT_INITIATED, artefact.artefactID, artefact.caveID); db_query_dstring(database, ds); debug(DEBUG_ARTEFACT, "initiate_artefact: %s", dstring_str(ds)); /* Bedingung: Artefakt und Höhle müssen existieren */ if (db_affected_rows(database) != 1) throw(SQL_EXCEPTION, "initiate_artefact: no such artefactID or caveID"); }
/* * Return the class name of the artefact with the given id. */ const char *artefact_name (db_t *database, int artefact_id) { struct Artefact artefact; struct Artefact_class artefact_class; get_artefact_by_id(database, artefact_id, &artefact); get_artefact_class_by_id(database, artefact.artefactClassID, &artefact_class); return artefact_class.name; }
/* * User wants to remove the artefact from a cave or another user just robbed * that user. Remove the artefact from its cave. */ void remove_artefact_from_cave (db_t *database, int artefactID) { struct Artefact artefact; /* save artefact values; throws exception, if that artefact is missing */ get_artefact_by_id(database, artefactID, &artefact); db_query(database, "UPDATE " DB_TABLE_ARTEFACT " SET caveID = 0 " "WHERE artefactID = %d", artefactID); db_query(database, "UPDATE Cave SET artefacts = artefacts - 1 " "WHERE caveID = %d", artefact.caveID); /* Bedingung: Höhle muss vorhanden sein */ if (db_affected_rows(database) != 1) throw(SQL_EXCEPTION, "remove_artefact_from_cave: no such caveID"); }
/* * merge_artefacts_special * Throws exception if needed conditions are not as they should have been. */ int merge_artefacts_special (db_t *database, const struct Artefact *key_artefact, struct Artefact *lock_artefact, struct Artefact *result_artefact) { db_result_t *result; db_result_t *temp_result; int row; dstring_t *ds; /* get merging formulas */ ds = dstring_new("SELECT * FROM Artefact_merge_special " "WHERE keyID = %d", key_artefact->artefactID); result = db_query_dstring(database, ds); debug(DEBUG_ARTEFACT, "merge_artefact_special: %s", dstring_str(ds)); /* check for a suitable merging formula */ while ((row = db_result_next_row(result))) { /* some special cases: * * lockID == 0 || keyID == lockID * no lock artefact needed; key artefact transforms directly * * resultID == 0 * key and lock artefacts just vanish */ /* lock artefact */ lock_artefact->artefactID = db_result_get_int(result, "lockID"); /* special cases: lockID == 0 || keyID == lockID (no lock required) */ if (lock_artefact->artefactID == 0 || lock_artefact->artefactID == key_artefact->artefactID) break; /* get lock_artefact */ /* throws exception, if that artefact is missing */ get_artefact_by_id(database, lock_artefact->artefactID, lock_artefact); /* check: key and lock have to be in the same cave and initiated */ if (lock_artefact->caveID == key_artefact->caveID && lock_artefact->initiated == ARTEFACT_INITIATED) break; } if (row) { /* result artefact */ result_artefact->artefactID = db_result_get_int(result, "resultID"); /* special case: resultID == 0 */ if (result_artefact->artefactID != 0) { /* get result_artefact */ /* throws exception, if that artefact is missing */ get_artefact_by_id(database, result_artefact->artefactID, result_artefact); /* check: result_artefact must not be in any cave */ if (result_artefact->caveID != 0) throwf(BAD_ARGUMENT_EXCEPTION, "merge_artefacts_special: result artefact %d is in cave %d", result_artefact->artefactID, result_artefact->caveID); /* result_artefact must not be in any movement */ temp_result = db_query(database, "SELECT * FROM Event_movement" " WHERE artefactID = %d", result_artefact->artefactID); if (db_result_num_rows(temp_result) != 0) throwf(BAD_ARGUMENT_EXCEPTION, "merge_artefacts_special: result artefact %d is moving", result_artefact->artefactID); /* check: result_artefact has to be uninitiated */ /* XXX can this ever happen (it is not in a cave)? */ if (result_artefact->initiated != ARTEFACT_UNINITIATED) uninitiate_artefact(database, result_artefact->artefactID); } /* now merge them */ merge_artefacts(database, key_artefact->caveID, key_artefact->artefactID, lock_artefact->artefactID, result_artefact->artefactID); return 1; } return 0; }