Ejemplo n.º 1
0
/*
 * 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));
}
Ejemplo n.º 2
0
/*
 * 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));
}
Ejemplo n.º 3
0
/*
 * 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");
}
Ejemplo n.º 4
0
/*
 * 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;
}
Ejemplo n.º 5
0
/*
 * 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");
}
Ejemplo n.º 6
0
/*
 * 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;
}