text:
package sqlite3

import (
	"context"
	"database/sql"
	"fmt"
	"reflect"
	"strings"
	"sync"
	"time"

	"github.com/pkg/errors"
	"github.com/thrasher-corp/sqlboiler/boil"
	"github.com/thrasher-corp/sqlboiler/queries"
	"github.com/thrasher-corp/sqlboiler/queries/qm"
	"github.com/thrasher-corp/sqlboiler/queries/qmhelper"
	"github.com/thrasher-corp/sqlboiler/strmangle"
)

// AuditEvent is an object representing the database table.
type AuditEvent struct {
	ID         int64  `boil:"id" json:"id" toml:"id" yaml:"id"`
	Type       string `boil:"type" json:"type" toml:"type" yaml:"type"`
	Identifier string `boil:"identifier" json:"identifier" toml:"identifier" yaml:"identifier"`
	Message    string `boil:"message" json:"message" toml:"message" yaml:"message"`
	CreatedAt  string `boil:"created_at" json:"created_at" toml:"created_at" yaml:"created_at"`

	R *auditEventR `boil:"-" json:"-" toml:"-" yaml:"-"`
	L auditEventL  `boil:"-" json:"-" toml:"-" yaml:"-"`
}

var AuditEventColumns = struct {
	ID         string
	Type       string
	Identifier string
	Message    string
	CreatedAt  string
}{
	ID:         "id",
	Type:       "type",
	Identifier: "identifier",
	Message:    "message",
	CreatedAt:  "created_at",
}

// Generated where

type whereHelperint64 struct{ field string }

func (w whereHelperint64) EQ(x int64) qm.QueryMod  { return qmhelper.Where(w.field, qmhelper.EQ, x) }
func (w whereHelperint64) NEQ(x int64) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.NEQ, x) }
func (w whereHelperint64) LT(x int64) qm.QueryMod  { return qmhelper.Where(w.field, qmhelper.LT, x) }
func (w whereHelperint64) LTE(x int64) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.LTE, x) }
func (w whereHelperint64) GT(x int64) qm.QueryMod  { return qmhelper.Where(w.field, qmhelper.GT, x) }
func (w whereHelperint64) GTE(x int64) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.GTE, x) }

type whereHelperstring struct{ field string }

func (w whereHelperstring) EQ(x string) qm.QueryMod  { return qmhelper.Where(w.field, qmhelper.EQ, x) }
func (w whereHelperstring) NEQ(x string) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.NEQ, x) }
func (w whereHelperstring) LT(x string) qm.QueryMod  { return qmhelper.Where(w.field, qmhelper.LT, x) }
func (w whereHelperstring) LTE(x string) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.LTE, x) }
func (w whereHelperstring) GT(x string) qm.QueryMod  { return qmhelper.Where(w.field, qmhelper.GT, x) }
func (w whereHelperstring) GTE(x string) qm.QueryMod { return qmhelper.Where(w.field, qmhelper.GTE, x) }
func (w whereHelperstring) IN(slice []string) qm.QueryMod {
	values := make([]interface{}, 0, len(slice))
	for _, value := range slice {
		values = append(values, value)
	}
	return qm.WhereIn(fmt.Sprintf("%s IN ?", w.field), values...)
}

var AuditEventWhere = struct {
	ID         whereHelperint64
	Type       whereHelperstring
	Identifier whereHelperstring
	Message    whereHelperstring
	CreatedAt  whereHelperstring
}{
	ID:         whereHelperint64{field: "\"audit_event\".\"id\""},
	Type:       whereHelperstring{field: "\"audit_event\".\"type\""},
	Identifier: whereHelperstring{field: "\"audit_event\".\"identifier\""},
	Message:    whereHelperstring{field: "\"audit_event\".\"message\""},
	CreatedAt:  whereHelperstring{field: "\"audit_event\".\"created_at\""},
}

// AuditEventRels is where relationship names are stored.
var AuditEventRels = struct {
}{}

// auditEventR is where relationships are stored.
type auditEventR struct {
}

// NewStruct creates a new relationship struct
func (*auditEventR) NewStruct() *auditEventR {
	return &auditEventR{}
}

// auditEventL is where Load methods for each relationship are stored.
type auditEventL struct{}

var (
	auditEventAllColumns            = []string{"id", "type", "identifier", "message", "created_at"}
	auditEventColumnsWithoutDefault = []string{"type", "identifier", "message"}
	auditEventColumnsWithDefault    = []string{"id", "created_at"}
	auditEventPrimaryKeyColumns     = []string{"id"}
)

type (
	// AuditEventSlice is an alias for a slice of pointers to AuditEvent.
	// This should generally be used opposed to []AuditEvent.
	AuditEventSlice []*AuditEvent
	// AuditEventHook is the signature for custom AuditEvent hook methods
	AuditEventHook func(context.Context, boil.ContextExecutor, *AuditEvent) error

	auditEventQuery struct {
		*queries.Query
	}
)

// Cache for insert, update and upsert
var (
	auditEventType                 = reflect.TypeOf(&AuditEvent{})
	auditEventMapping              = queries.MakeStructMapping(auditEventType)
	auditEventPrimaryKeyMapping, _ = queries.BindMapping(auditEventType, auditEventMapping, auditEventPrimaryKeyColumns)
	auditEventInsertCacheMut       sync.RWMutex
	auditEventInsertCache          = make(map[string]insertCache)
	auditEventUpdateCacheMut       sync.RWMutex
	auditEventUpdateCache          = make(map[string]updateCache)
	auditEventUpsertCacheMut       sync.RWMutex
	auditEventUpsertCache          = make(map[string]insertCache)
)

var (
	// Force time package dependency for automated UpdatedAt/CreatedAt.
	_ = time.Second
	// Force qmhelper dependency for where clause generation (which doesn't
	// always happen)
	_ = qmhelper.Where
)

var auditEventBeforeInsertHooks []AuditEventHook
var auditEventBeforeUpdateHooks []AuditEventHook
var auditEventBeforeDeleteHooks []AuditEventHook
var auditEventBeforeUpsertHooks []AuditEventHook

var auditEventAfterInsertHooks []AuditEventHook
var auditEventAfterSelectHooks []AuditEventHook
var auditEventAfterUpdateHooks []AuditEventHook
var auditEventAfterDeleteHooks []AuditEventHook
var auditEventAfterUpsertHooks []AuditEventHook

// doBeforeInsertHooks executes all "before insert" hooks.
func (o *AuditEvent) doBeforeInsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) {
	if boil.HooksAreSkipped(ctx) {
		return nil
	}

	for _, hook := range auditEventBeforeInsertHooks {
		if err := hook(ctx, exec, o); err != nil {
			return err
		}
	}

	return nil
}

// doBeforeUpdateHooks executes all "before Update" hooks.
func (o *AuditEvent) doBeforeUpdateHooks(ctx context.Context, exec boil.ContextExecutor) (err error) {
	if boil.HooksAreSkipped(ctx) {
		return nil
	}

	for _, hook := range auditEventBeforeUpdateHooks {
		if err := hook(ctx, exec, o); err != nil {
			return err
		}
	}

	return nil
}

// doBeforeDeleteHooks executes all "before Delete" hooks.
func (o *AuditEvent) doBeforeDeleteHooks(ctx context.Context, exec boil.ContextExecutor) (err error) {
	if boil.HooksAreSkipped(ctx) {
		return nil
	}

	for _, hook := range auditEventBeforeDeleteHooks {
		if err := hook(ctx, exec, o); err != nil {
			return err
		}
	}

	return nil
}

// doBeforeUpsertHooks executes all "before Upsert" hooks.
func (o *AuditEvent) doBeforeUpsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) {
	if boil.HooksAreSkipped(ctx) {
		return nil
	}

	for _, hook := range auditEventBeforeUpsertHooks {
		if err := hook(ctx, exec, o); err != nil {
			return err
		}
	}

	return nil
}

// doAfterInsertHooks executes all "after Insert" hooks.
func (o *AuditEvent) doAfterInsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) {
	if boil.HooksAreSkipped(ctx) {
		return nil
	}

	for _, hook := range auditEventAfterInsertHooks {
		if err := hook(ctx, exec, o); err != nil {
			return err
		}
	}

	return nil
}

// doAfterSelectHooks executes all "after Select" hooks.
func (o *AuditEvent) doAfterSelectHooks(ctx context.Context, exec boil.ContextExecutor) (err error) {
	if boil.HooksAreSkipped(ctx) {
		return nil
	}

	for _, hook := range auditEventAfterSelectHooks {
		if err := hook(ctx, exec, o); err != nil {
			return err
		}
	}

	return nil
}

// doAfterUpdateHooks executes all "after Update" hooks.
func (o *AuditEvent) doAfterUpdateHooks(ctx context.Context, exec boil.ContextExecutor) (err error) {
	if boil.HooksAreSkipped(ctx) {
		return nil
	}

	for _, hook := range auditEventAfterUpdateHooks {
		if err := hook(ctx, exec, o); err != nil {
			return err
		}
	}

	return nil
}

// doAfterDeleteHooks executes all "after Delete" hooks.
func (o *AuditEvent) doAfterDeleteHooks(ctx context.Context, exec boil.ContextExecutor) (err error) {
	if boil.HooksAreSkipped(ctx) {
		return nil
	}

	for _, hook := range auditEventAfterDeleteHooks {
		if err := hook(ctx, exec, o); err != nil {
			return err
		}
	}

	return nil
}

// doAfterUpsertHooks executes all "after Upsert" hooks.
func (o *AuditEvent) doAfterUpsertHooks(ctx context.Context, exec boil.ContextExecutor) (err error) {
	if boil.HooksAreSkipped(ctx) {
		return nil
	}

	for _, hook := range auditEventAfterUpsertHooks {
		if err := hook(ctx, exec, o); err != nil {
			return err
		}
	}

	return nil
}

// AddAuditEventHook registers your hook function for all future operations.
func AddAuditEventHook(hookPoint boil.HookPoint, auditEventHook AuditEventHook) {
	switch hookPoint {
	case boil.BeforeInsertHook:
		auditEventBeforeInsertHooks = append(auditEventBeforeInsertHooks, auditEventHook)
	case boil.BeforeUpdateHook:
		auditEventBeforeUpdateHooks = append(auditEventBeforeUpdateHooks, auditEventHook)
	case boil.BeforeDeleteHook:
		auditEventBeforeDeleteHooks = append(auditEventBeforeDeleteHooks, auditEventHook)
	case boil.BeforeUpsertHook:
		auditEventBeforeUpsertHooks = append(auditEventBeforeUpsertHooks, auditEventHook)
	case boil.AfterInsertHook:
		auditEventAfterInsertHooks = append(auditEventAfterInsertHooks, auditEventHook)
	case boil.AfterSelectHook:
		auditEventAfterSelectHooks = append(auditEventAfterSelectHooks, auditEventHook)
	case boil.AfterUpdateHook:
		auditEventAfterUpdateHooks = append(auditEventAfterUpdateHooks, auditEventHook)
	case boil.AfterDeleteHook:
		auditEventAfterDeleteHooks = append(auditEventAfterDeleteHooks, auditEventHook)
	case boil.AfterUpsertHook:
		auditEventAfterUpsertHooks = append(auditEventAfterUpsertHooks, auditEventHook)
	}
}

// One returns a single auditEvent record from the query.
func (q auditEventQuery) One(ctx context.Context, exec boil.ContextExecutor) (*AuditEvent, error) {
	o := &AuditEvent{}

	queries.SetLimit(q.Query, 1)

	err := q.Bind(ctx, exec, o)
	if err != nil {
		if errors.Cause(err) == sql.ErrNoRows {
			return nil, sql.ErrNoRows
		}
		return nil, errors.Wrap(err, "sqlite3: failed to execute a one query for audit_event")
	}

	if err := o.doAfterSelectHooks(ctx, exec); err != nil {
		return o, err
	}

	return o, nil
}

// All returns all AuditEvent records from the query.
func (q auditEventQuery) All(ctx context.Context, exec boil.ContextExecutor) (AuditEventSlice, error) {
	var o []*AuditEvent

	err := q.Bind(ctx, exec, &o)
	if err != nil {
		return nil, errors.Wrap(err, "sqlite3: failed to assign all query results to AuditEvent slice")
	}

	if len(auditEventAfterSelectHooks) != 0 {
		for _, obj := range o {
			if err := obj.doAfterSelectHooks(ctx, exec); err != nil {
				return o, err
			}
		}
	}

	return o, nil
}

// Count returns the count of all AuditEvent records in the query.
func (q auditEventQuery) Count(ctx context.Context, exec boil.ContextExecutor) (int64, error) {
	var count int64

	queries.SetSelect(q.Query, nil)
	queries.SetCount(q.Query)

	err := q.Query.QueryRowContext(ctx, exec).Scan(&count)
	if err != nil {
		return 0, errors.Wrap(err, "sqlite3: failed to count audit_event rows")
	}

	return count, nil
}

// Exists checks if the row exists in the table.
func (q auditEventQuery) Exists(ctx context.Context, exec boil.ContextExecutor) (bool, error) {
	var count int64

	queries.SetSelect(q.Query, nil)
	queries.SetCount(q.Query)
	queries.SetLimit(q.Query, 1)

	err := q.Query.QueryRowContext(ctx, exec).Scan(&count)
	if err != nil {
		return false, errors.Wrap(err, "sqlite3: failed to check if audit_event exists")
	}

	return count > 0, nil
}

// AuditEvents retrieves all the records using an executor.
func AuditEvents(mods ...qm.QueryMod) auditEventQuery {
	mods = append(mods, qm.From("\"audit_event\""))
	return auditEventQuery{NewQuery(mods...)}
}

// FindAuditEvent retrieves a single record by ID with an executor.
// If selectCols is empty Find will return all columns.
func FindAuditEvent(ctx context.Context, exec boil.ContextExecutor, iD int64, selectCols ...string) (*AuditEvent, error) {
	auditEventObj := &AuditEvent{}

	sel := "*"
	if len(selectCols) > 0 {
		sel = strings.Join(strmangle.IdentQuoteSlice(dialect.LQ, dialect.RQ, selectCols), ",")
	}
	query := fmt.Sprintf(
		"select %s from \"audit_event\" where \"id\"=?", sel,
	)

	q := queries.Raw(query, iD)

	err := q.Bind(ctx, exec, auditEventObj)
	if err != nil {
		if errors.Cause(err) == sql.ErrNoRows {
			return nil, sql.ErrNoRows
		}
		return nil, errors.Wrap(err, "sqlite3: unable to select from audit_event")
	}

	return auditEventObj, nil
}

// Insert a single record using an executor.
// See boil.Columns.InsertColumnSet documentation to understand column list inference for inserts.
func (o *AuditEvent) Insert(ctx context.Context, exec boil.ContextExecutor, columns boil.Columns) error {
	if o == nil {
		return errors.New("sqlite3: no audit_event provided for insertion")
	}

	var err error

	if err := o.doBeforeInsertHooks(ctx, exec); err != nil {
		return err
	}

	nzDefaults := queries.NonZeroDefaultSet(auditEventColumnsWithDefault, o)

	key := makeCacheKey(columns, nzDefaults)
	auditEventInsertCacheMut.RLock()
	cache, cached := auditEventInsertCache[key]
	auditEventInsertCacheMut.RUnlock()

	if !cached {
		wl, returnColumns := columns.InsertColumnSet(
			auditEventAllColumns,
			auditEventColumnsWithDefault,
			auditEventColumnsWithoutDefault,
			nzDefaults,
		)

		cache.valueMapping, err = queries.BindMapping(auditEventType, auditEventMapping, wl)
		if err != nil {
			return err
		}
		cache.retMapping, err = queries.BindMapping(auditEventType, auditEventMapping, returnColumns)
		if err != nil {
			return err
		}
		if len(wl) != 0 {
			cache.query = fmt.Sprintf("INSERT INTO \"audit_event\" (\"%s\") %%sVALUES (%s)%%s", strings.Join(wl, "\",\""), strmangle.Placeholders(dialect.UseIndexPlaceholders, len(wl), 1, 1))
		} else {
			cache.query = "INSERT INTO \"audit_event\" () VALUES ()%s%s"
		}

		var queryOutput, queryReturning string

		if len(cache.retMapping) != 0 {
			cache.retQuery = fmt.Sprintf("SELECT \"%s\" FROM \"audit_event\" WHERE %s", strings.Join(returnColumns, "\",\""), strmangle.WhereClause("\"", "\"", 0, auditEventPrimaryKeyColumns))
		}

		cache.query = fmt.Sprintf(cache.query, queryOutput, queryReturning)
	}

	value := reflect.Indirect(reflect.ValueOf(o))
	vals := queries.ValuesFromMapping(value, cache.valueMapping)

	if boil.DebugMode {
		fmt.Fprintln(boil.DebugWriter, cache.query)
		fmt.Fprintln(boil.DebugWriter, vals)
	}

	result, err := exec.ExecContext(ctx, cache.query, vals...)

	if err != nil {
		return errors.Wrap(err, "sqlite3: unable to insert into audit_event")
	}

	var lastID int64
	var identifierCols []interface{}

	if len(cache.retMapping) == 0 {
		goto CacheNoHooks
	}

	lastID, err = result.LastInsertId()
	if err != nil {
		return ErrSyncFail
	}

	o.ID = int64(lastID)
	if lastID != 0 && len(cache.retMapping) == 1 && cache.retMapping[0] == auditEventMapping["ID"] {
		goto CacheNoHooks
	}

	identifierCols = []interface{}{
		o.ID,
	}

	if boil.DebugMode {
		fmt.Fprintln(boil.DebugWriter, cache.retQuery)
		fmt.Fprintln(boil.DebugWriter, identifierCols...)
	}

	err = exec.QueryRowContext(ctx, cache.retQuery, identifierCols...).Scan(queries.PtrsFromMapping(value, cache.retMapping)...)
	if err != nil {
		return errors.Wrap(err, "sqlite3: unable to populate default values for audit_event")
	}

CacheNoHooks:
	if !cached {
		auditEventInsertCacheMut.Lock()
		auditEventInsertCache[key] = cache
		auditEventInsertCacheMut.Unlock()
	}

	return o.doAfterInsertHooks(ctx, exec)
}

// Update uses an executor to update the AuditEvent.
// See boil.Columns.UpdateColumnSet documentation to understand column list inference for updates.
// Update does not automatically update the record in case of default values. Use .Reload() to refresh the records.
func (o *AuditEvent) Update(ctx context.Context, exec boil.ContextExecutor, columns boil.Columns) (int64, error) {
	var err error
	if err = o.doBeforeUpdateHooks(ctx, exec); err != nil {
		return 0, err
	}
	key := makeCacheKey(columns, nil)
	auditEventUpdateCacheMut.RLock()
	cache, cached := auditEventUpdateCache[key]
	auditEventUpdateCacheMut.RUnlock()

	if !cached {
		wl := columns.UpdateColumnSet(
			auditEventAllColumns,
			auditEventPrimaryKeyColumns,
		)

		if len(wl) == 0 {
			return 0, errors.New("sqlite3: unable to update audit_event, could not build whitelist")
		}

		cache.query = fmt.Sprintf("UPDATE \"audit_event\" SET %s WHERE %s",
			strmangle.SetParamNames("\"", "\"", 0, wl),
			strmangle.WhereClause("\"", "\"", 0, auditEventPrimaryKeyColumns),
		)
		cache.valueMapping, err = queries.BindMapping(auditEventType, auditEventMapping, append(wl, auditEventPrimaryKeyColumns...))
		if err != nil {
			return 0, err
		}
	}

	values := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(o)), cache.valueMapping)

	if boil.DebugMode {
		fmt.Fprintln(boil.DebugWriter, cache.query)
		fmt.Fprintln(boil.DebugWriter, values)
	}

	var result sql.Result
	result, err = exec.ExecContext(ctx, cache.query, values...)
	if err != nil {
		return 0, errors.Wrap(err, "sqlite3: unable to update audit_event row")
	}

	rowsAff, err := result.RowsAffected()
	if err != nil {
		return 0, errors.Wrap(err, "sqlite3: failed to get rows affected by update for audit_event")
	}

	if !cached {
		auditEventUpdateCacheMut.Lock()
		auditEventUpdateCache[key] = cache
		auditEventUpdateCacheMut.Unlock()
	}

	return rowsAff, o.doAfterUpdateHooks(ctx, exec)
}

// UpdateAll updates all rows with the specified column values.
func (q auditEventQuery) UpdateAll(ctx context.Context, exec boil.ContextExecutor, cols M) (int64, error) {
	queries.SetUpdate(q.Query, cols)

	result, err := q.Query.ExecContext(ctx, exec)
	if err != nil {
		return 0, errors.Wrap(err, "sqlite3: unable to update all for audit_event")
	}

	rowsAff, err := result.RowsAffected()
	if err != nil {
		return 0, errors.Wrap(err, "sqlite3: unable to retrieve rows affected for audit_event")
	}

	return rowsAff, nil
}

// UpdateAll updates all rows with the specified column values, using an executor.
func (o AuditEventSlice) UpdateAll(ctx context.Context, exec boil.ContextExecutor, cols M) (int64, error) {
	ln := int64(len(o))
	if ln == 0 {
		return 0, nil
	}

	if len(cols) == 0 {
		return 0, errors.New("sqlite3: update all requires at least one column argument")
	}

	colNames := make([]string, len(cols))
	args := make([]interface{}, len(cols))

	i := 0
	for name, value := range cols {
		colNames[i] = name
		args[i] = value
		i++
	}

	// Append all of the primary key values for each column
	for _, obj := range o {
		pkeyArgs := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(obj)), auditEventPrimaryKeyMapping)
		args = append(args, pkeyArgs...)
	}

	sql := fmt.Sprintf("UPDATE \"audit_event\" SET %s WHERE %s",
		strmangle.SetParamNames("\"", "\"", 0, colNames),
		strmangle.WhereClauseRepeated(string(dialect.LQ), string(dialect.RQ), 0, auditEventPrimaryKeyColumns, len(o)))

	if boil.DebugMode {
		fmt.Fprintln(boil.DebugWriter, sql)
		fmt.Fprintln(boil.DebugWriter, args...)
	}

	result, err := exec.ExecContext(ctx, sql, args...)
	if err != nil {
		return 0, errors.Wrap(err, "sqlite3: unable to update all in auditEvent slice")
	}

	rowsAff, err := result.RowsAffected()
	if err != nil {
		return 0, errors.Wrap(err, "sqlite3: unable to retrieve rows affected all in update all auditEvent")
	}
	return rowsAff, nil
}

// Delete deletes a single AuditEvent record with an executor.
// Delete will match against the primary key column to find the record to delete.
func (o *AuditEvent) Delete(ctx context.Context, exec boil.ContextExecutor) (int64, error) {
	if o == nil {
		return 0, errors.New("sqlite3: no AuditEvent provided for delete")
	}

	if err := o.doBeforeDeleteHooks(ctx, exec); err != nil {
		return 0, err
	}

	args := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(o)), auditEventPrimaryKeyMapping)
	sql := "DELETE FROM \"audit_event\" WHERE \"id\"=?"

	if boil.DebugMode {
		fmt.Fprintln(boil.DebugWriter, sql)
		fmt.Fprintln(boil.DebugWriter, args...)
	}

	result, err := exec.ExecContext(ctx, sql, args...)
	if err != nil {
		return 0, errors.Wrap(err, "sqlite3: unable to delete from audit_event")
	}

	rowsAff, err := result.RowsAffected()
	if err != nil {
		return 0, errors.Wrap(err, "sqlite3: failed to get rows affected by delete for audit_event")
	}

	if err := o.doAfterDeleteHooks(ctx, exec); err != nil {
		return 0, err
	}

	return rowsAff, nil
}

// DeleteAll deletes all matching rows.
func (q auditEventQuery) DeleteAll(ctx context.Context, exec boil.ContextExecutor) (int64, error) {
	if q.Query == nil {
		return 0, errors.New("sqlite3: no auditEventQuery provided for delete all")
	}

	queries.SetDelete(q.Query)

	result, err := q.Query.ExecContext(ctx, exec)
	if err != nil {
		return 0, errors.Wrap(err, "sqlite3: unable to delete all from audit_event")
	}

	rowsAff, err := result.RowsAffected()
	if err != nil {
		return 0, errors.Wrap(err, "sqlite3: failed to get rows affected by deleteall for audit_event")
	}

	return rowsAff, nil
}

// DeleteAll deletes all rows in the slice, using an executor.
func (o AuditEventSlice) DeleteAll(ctx context.Context, exec boil.ContextExecutor) (int64, error) {
	if len(o) == 0 {
		return 0, nil
	}

	if len(auditEventBeforeDeleteHooks) != 0 {
		for _, obj := range o {
			if err := obj.doBeforeDeleteHooks(ctx, exec); err != nil {
				return 0, err
			}
		}
	}

	var args []interface{}
	for _, obj := range o {
		pkeyArgs := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(obj)), auditEventPrimaryKeyMapping)
		args = append(args, pkeyArgs...)
	}

	sql := "DELETE FROM \"audit_event\" WHERE " +
		strmangle.WhereClauseRepeated(string(dialect.LQ), string(dialect.RQ), 0, auditEventPrimaryKeyColumns, len(o))

	if boil.DebugMode {
		fmt.Fprintln(boil.DebugWriter, sql)
		fmt.Fprintln(boil.DebugWriter, args)
	}

	result, err := exec.ExecContext(ctx, sql, args...)
	if err != nil {
		return 0, errors.Wrap(err, "sqlite3: unable to delete all from auditEvent slice")
	}

	rowsAff, err := result.RowsAffected()
	if err != nil {
		return 0, errors.Wrap(err, "sqlite3: failed to get rows affected by deleteall for audit_event")
	}

	if len(auditEventAfterDeleteHooks) != 0 {
		for _, obj := range o {
			if err := obj.doAfterDeleteHooks(ctx, exec); err != nil {
				return 0, err
			}
		}
	}

	return rowsAff, nil
}

// Reload refetches the object from the database
// using the primary keys with an executor.
func (o *AuditEvent) Reload(ctx context.Context, exec boil.ContextExecutor) error {
	ret, err := FindAuditEvent(ctx, exec, o.ID)
	if err != nil {
		return err
	}

	*o = *ret
	return nil
}

// ReloadAll refetches every row with matching primary key column values
// and overwrites the original object slice with the newly updated slice.
func (o *AuditEventSlice) ReloadAll(ctx context.Context, exec boil.ContextExecutor) error {
	if o == nil || len(*o) == 0 {
		return nil
	}

	slice := AuditEventSlice{}
	var args []interface{}
	for _, obj := range *o {
		pkeyArgs := queries.ValuesFromMapping(reflect.Indirect(reflect.ValueOf(obj)), auditEventPrimaryKeyMapping)
		args = append(args, pkeyArgs...)
	}

	sql := "SELECT \"audit_event\".* FROM \"audit_event\" WHERE " +
		strmangle.WhereClauseRepeated(string(dialect.LQ), string(dialect.RQ), 0, auditEventPrimaryKeyColumns, len(*o))

	q := queries.Raw(sql, args...)

	err := q.Bind(ctx, exec, &slice)
	if err != nil {
		return errors.Wrap(err, "sqlite3: unable to reload all in AuditEventSlice")
	}

	*o = slice

	return nil
}

// AuditEventExists checks if the AuditEvent row exists.
func AuditEventExists(ctx context.Context, exec boil.ContextExecutor, iD int64) (bool, error) {
	var exists bool
	sql := "select exists(select 1 from \"audit_event\" where \"id\"=? limit 1)"

	if boil.DebugMode {
		fmt.Fprintln(boil.DebugWriter, sql)
		fmt.Fprintln(boil.DebugWriter, iD)
	}

	row := exec.QueryRowContext(ctx, sql, iD)

	err := row.Scan(&exists)
	if err != nil {
		return false, errors.Wrap(err, "sqlite3: unable to check if audit_event exists")
	}

	return exists, nil
}


text:
'use strict';
/* jshint -W098 */

// goal authorization helpers
var hasAuthorization = function (req, res, next) {
    if (!req.user.isAdmin && req.goal.user.id !== req.user.id) {
        return res.status(401).send('User is not authorized');
    }
    next();
};

module.exports = function (ChatHistories, app, auth) {
    var chatHistories = require('../controllers/chatHistory.Controller')(ChatHistories);

    app.route('/api/ChatHistories').get(chatHistories.all);
    app.route('/api/ChatHistories').post(auth.requiresLogin, chatHistories.createChatHistory);
    app.route('/api/ChatHistories/:ChatHistoryId').get(auth.isMongoId, chatHistories.show);
    app.route('/api/ChatHistories/:ChatHistoryId').delete(auth.requiresLogin, chatHistories.destroy);
    app.route('/api/ChatHistories/:ChatHistoryId').put(auth.requiresLogin, chatHistories.update);

    // Finish with setting up the goalId param
    app.param('ChatHistoriesId', chatHistories.chatHistory);

};

redpajama_set_name: RedPajamaGithub


text:
"use strict";

zip.workerScriptsPath = chrome.extension.getURL('lib/zip.js/WebContent/');

// When the extension is installed or upgraded ...
chrome.runtime.onInstalled.addListener(function() {
  // Replace all rules ...
  chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
    // With a new rule ...
    var paths = [
      "/contest/[0-9]+/?$",
      "/contest/[0-9]+/problem/[A-Z]{1}/?$",
      "/problemset/problem/[0-9]+/[A-Z]{1}/?$"
    ];

    var url_matchers = paths.map(function (path) {
      return new chrome.declarativeContent.PageStateMatcher({
        pageUrl: { urlMatches: 'codeforces\.(com|ru)' + path }
      });
    });

    chrome.declarativeContent.onPageChanged.addRules([{
      conditions: url_matchers,
      actions: [ new chrome.declarativeContent.ShowPageAction() ]
    }]);
  }); // removeRules ending
}); // addListener ending

chrome.pageAction.onClicked.addListener(function(tab) {
  chrome.tabs.executeScript(null, { file: "utils.js" }, function (result) {
    chrome.tabs.executeScript(null, { file: "content_script.js" });
  });
});

chrome.runtime.onMessage.addListener( function(request, sender, sendResponse) {
  zipDataset(request.files).then(function (zip) {
    promptDownloadURL(request.filename, URL.createObjectURL(zip));
  });
});


text:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<meta http-equiv="content-type" content="text/html;charset=utf-8" />

    <title>Retail - Billy Vs. SNAKEMAN Wiki</title>

    <meta http-equiv="content-type" content="text/html;charset=UTF-8"/>

    <meta http-equiv="content-language" content="en"/>

    <link rel="shortcut icon" href="local--favicon/favicon.gif"/>
    <link rel="icon" type="image/gif" href="local--favicon/favicon.gif"/>

            <link rel="apple-touch-icon" href="common--images/apple-touch-icon-57x57.png" />
        <link rel="apple-touch-icon" sizes="72x72" href="common--images/apple-touch-icon-72x72.png" />
        <link rel="apple-touch-icon" sizes="114x114" href="common--images/apple-touch-icon-114x114.png" />

            <link rel="alternate" type="application/wiki" title="Edit this page" href="javascript:WIKIDOT.page.listeners.editClick()"/>

        <link rel="manifest" href="onesignal/manifest.html" />

Billy Vs. SNAKEMAN Wiki

Be the Ultimate Ninja.

    <form id="search-top-box-form" action="http://bvs.wikidot.com/dummy" class="input-append">
        <input id="search-top-box-input" class="text empty search-query" type="text" size="15" name="query" value="Search this site" onfocus="if(YAHOO.util.Dom.hasClass(this, 'empty')){YAHOO.util.Dom.removeClass(this,'empty'); this.value='';}"/><input class="button btn" type="submit" name="search" value="Search"/>
    </form>

Allies

Allies Untabbed

Burger Ninja

Reaper

Regular

R00t

Season 2+

Season 3+

Season 4+

The Trade

Wasteland

World Kaiju

Summons

Teams

Missions

Missions Untabbed

D-Rank

C-Rank

B-Rank

A-Rank

AA-Rank

S-Rank

BurgerNinja

Cave

Jungle

Monochrome

Outskirts

PizzaWitch

Reaper

Wasteland

Witching Hour

Quests

Mission Lady Alley

Items

Items Untabbed

Ally Drops and Other

Permanent Items

Potions/Crafting Items

Crafting

Ingredients

Potions

Wasteland Items

Sponsored Items

Village

BillyCon

Billy Idol

Cosplay

Dealer's Room

Events

Glowslinging

Rave

Squee

Video Game Tournament

Wander

BillyTV

Bingo'ing

Candyween

Festival Day

Bargltron

BillyMaze

Dance Party

ElevenSnax

Marksman

Raffle

RNGShack

TsukiRoll

Tunnel

Hidden HoClaus

Kaiju

Marketplace

PizzaWitch Garage

Robo Fighto

R00t

Fields

Keys

Phases

SCIENCE!

Upgrades

Zombjas

Party House

11DBHK's Lottery

AkaTsukiBall

Crane Game!

Darts!

Flower Wars

'Juice' Bar

Mahjong

Ninja Jackpot!

Over 11,000

Pachinko

Party Room

Pigeons

Prize Wheel

Roulette

Scratchy Tickets

SNAKEMAN

SUPERFAIL

Tip Line

The Big Board

The First Loser

Guides

BillyCon Guide

BurgerNinja Guide

Candyween Guide

Glossary

Glowslinging Strategy Guide

Hero's Quest

Looping Guide

Monochrome Guide

Overnight Bonuses

PizzaWitch Guide

Potions / Crafting

Crafting

Items

Materials

Potion Mixing

Mixed Ingredients

Potions

Reduction Laboratory

Potions and Ingredients

Wasteland Items

Impossible Mission Guide

Ranking Guide

Reaper Guide

Reaper's Game Guide

R00t Guide

Speed Content Guide

Speedlooping Guide

The Trade Guide

Wasteland Guide

Other

Arena

Billy Club

Boosters

Karma

Bloodlines

Jutsu

Bloodline Jutsu

Regular Jutsu

Special Jutsu

Mission Bonus

News Archive

Number One

Old News Archive

Perfect Poker Bosses

Pets

Retail

Ryo

Spar With Friends

Sponsored Items

Store

Themes

Trophies

Untabbed

Allies

Items

Jutsu

Missions

Potions / Crafting

World Kaiju

Utilities

Awesome Calculator

Item Checker

Mission Calculator

R00t Calculator

Success Calculator

Templates

Wiki Chat Box

Create account or Sign in

Play BvS Now!

Site members

Wiki Membership

Forum Main

Recent Posts

Recent changes

List all pages

Page Tags

Players

Villages

Other Resources

Notice: Do not send bug reports based on the information on this site. If this site is not matching up with what you're experiencing in game, that is a problem with this site, not with the game.

                            Retail

▼ Introduction

▲ I'm done here

Standing on the inside of the Safe Zone, steeling yourself for the horrors to come, you glance back at the door to the other world, grinding closed - someone has to do this, apparently, or all is lost.

The moan from outside is still noticeable, even across the length of the store in front of you. Beings, consumed with hunger for what you sell, pound on the doors outside.

Darkness consumes the world, and you are alone, with the sound of your heart beating in rhythm with the pounding outside.

You need to be here, though - at least, if you want to work through the Rage and get yourself paid.

You sigh, clip on your nametag, and mash the button that throws on the lights and unlocks the doors. Another day on the line..

Play Retail >

Overview

Retail is a minigame in which you play an employee of an anime-goods store, dealing with customers. Customers come in with a certain amount of Stinginess, which you must overcome to make a sale. Customers' actions also tend to fill you with Rage, which is both useful and dangerous. And then, of course, there are the special customers, who come by as you're trying to close up shop…

Tiers (and Titans)

Retail is divided into Tiers. Each time you go up to a new Tier, you get access to a new set of Rage abilities, a new set of Wage abilities, and a new Shift. (Higher Tiers still have access to lower Tiers' abilities and Shifts.)

All players start at Tier 1, with access only to the Tier 1 Shift, "Training Schedule". In order to reach a higher Tier, you must defeat the boss of your current Tier: a Titan.1

Titan battles for a Shift are unlocked by purchasing 7 Rage abilities per Tier; once unlocked, they have a chance of taking place after every successfully-completed Shift. The Titan you fight at your current Tier's Shift (the highest Shift you have access to) will always be the Tier Boss, which you will only fight once. Thereafter, if you fight a Titan on that Shift, you'll fight one of a small set of non-Boss Titans.

Shifts

Shifts are where the action is.2 Each Shift has a different set of Customers that may show up; more difficult Customers will only show up in higher-Tier Shifts.

In order to complete a shift successfully, there are four things you need to worry about: Customers, Time, Sales, and Rage.

Customers: You start a Shift with a number of Remaining Customers determined by the Shift. Every time a customer leaves your store (whether you make a sale or not), this goes down by 1. If you run out of Customers, the shift ends. (Possibly successfully.)

Time: You start a Shift with <tt>???</tt> Remaining Time (plus any extra Time from abilities). Every time you take an Action (except for a few that say "no time passes"), you lose 1 Time. If you run out of Time, the shift ends.

Sales: You start a Shift with zero Sales. Every time you successfully reduce a Customer's Stinginess to zero, their Bankroll is added to your Sales. If you have enough Sales to meet the Shift's sales requirement when the Shift ends, you win!

Rage: You start a Shift with zero Rage and 11 Max Rage (plus any extra Max Rage from abilities). Every time the Time Remaining goes down, Customers increase this, more or less at random, and more or less constantly. If your Rage ever exceeds your Max Rage, you Rage Out and fail the Shift.

Once the Shift ends, if you were successful, you get Rage equal to your Rage3, and Wage equal to your Sales, modified by any relevant abilities you have. You can spend this accumulated Rage and Wage on abilities.

If Time runs out while there are still Customers in the store, this isn't technically a loss (you still get the appropriate amount of Rage and Wage from the Shift), but you won't have a Titan show up. Since Titans give a huge bonus to banked Rage and Wage, you should always try to get rid of your customers before time runs out to make room for a Titan.

Most of the time, your current Tier's Shift will be too hard without some of your current Tier's Rage abilities. Until you can purchase them, you'll probably want to work the Shift one Tier down: not only is it easier, but occasionally Titans will show up, providing you with more Rage on average. (The Tier 2 shift is a striking exception: it's not too difficult, but it's much more lucrative than Tier 1.)

The word "Shift" is also used to mean "a point in the action pool which you can spend to work a Shift". This sort of Shift is mostly acquired by Hanging Out with Allies; see below.

Gaining Shifts

There are 4 ways to gain Shifts: automatically, from Daily Workers, from Trading in Hang Outs, and from Boosters. All unused Shifts are lost at dayroll.

Automatic

Every day, you get 1 Shift just for showing up. Through upgrades and Poker, you can increase this number:

Upgrade
Shifts
How to Obtain

Steady Ride
+1 Shift
Tier 1 Wage Upgrade (200 Wage)

Open Availability
+1 Shift
Tier 3 Wage Upgrade (2500 Wage)

Poker Rank 6
+1 Shift
Defeat MC Stripeypants in Perfect Poker

Daily Workers

Every time you Hang Out with an ally via Friend Points, you receive a banked favor from them (if you didn't already have one). These are listed on the Retail page as "Allies who owe you one".

Every day, for each player, 8 Allies are selected at random from the complete pool of Allies, and are displayed on the Retail page. (Allies you don't have will appear as question marks.) If you have a banked favor from any of these characters, you can beg Shifts from these Allies, at +1 Shift per Ally. This "uses up" the favor, and you must Hang Out with them again before they'll give you any more Shifts.

Trading in Hang Outs

Any current Hang Outs (whether earned through Friend Points or otherwise) can be "Cashed-In" for additional Shifts. This cashing-in can only be performed once a day. After cashing in, you will still be Hanging Out with those characters, so you can still (e.g.) pass Quest checks or purchase Jutsu for reduced costs.

The first Shift from this method is available for only one Hang Out, but for each additional Shift the number of required Hang Outs doubles.

▼ Full Table

▲ Hide Table

Hang Outs
Shifts

1
1

2
2

4
3

8
4

16
5

32
6

64
7

(Presumably 128 Hang Outs would net you 8 Shifts, but at present only 106 Allies are known to exist.)

Boosters

Packs of 3 +5 Retail Shifts boosters are available for 60 Karma. Additionally, Retail Boosters are sometimes given out at the ElevenSnax booth at the Festival.

Tiers

Tier
Shift
Description
Base Success Pay
Job Title

1
Training Schedule
Nice, simple customers
5
Trainee

2
Weekday Afternoon
A typical, lazy afternoon
30
Swing Shifter

3
Late Night
The freaks come out at night
50
Keyed Employee

4
Weekend Rush
Everyone needs their fix
70
Assistant to the Manager

5
The Day before Ninjamas
last minute shoppers
110
Shift Manager

6
Move-In Weekend
A tired and cranky horde
130
Manager

7
The Day AFTER Ninjamas
gift certificates, angry parents
150
Retail Jockey

8
Dark Friday
RNG help us all
300
First Key

9
Infinite
How high can you get? Current Rank: XX
420 + 10/Rank
Atelier <Player Name>

Beating the Dark Friday boss, without having a certain item gets a special message.

▼ Special message

▲ Special message

Locked   Walk a quiet Zombja map, during the Calling,

               to find what you need..

T1: Training Schedule

T2: Weekday Afternoon

T3: Late Night

T4: Weekend Rush

T5: The Day before Ninjamas

T6: Move-In Weekend

T7: The Day AFTER Ninjamas

T8: Dark Friday

T9: Infinite

T10: Black Friday

Customers: Con Bro, Fanboy, Fangirl, Wanderer

Boss Titan: The Shuffler

Strategy: This is the easy shift; you shouldn't need to worry about optimal strategies yet. Take your time and get used to the basics.

Buy up Rage abilities as fast as you can, though: the next Tier isn't too much harder, but pays much better.

Customers: Con Bro, Fanboy, Fangirl

Boss Titan: Lady Evil

Strategy:

Customers:

Boss Titan: Mister Stares

Strategy:

Customers: Bad Haggler, Buffet, Con Bro, Ghost Michelle, Hater, One-Up, Shipper, Skimmer, Soft Talker, Umm, Wanderer

Boss Titan: Crapit

Strategy:

Customers: Bad Haggler, Buffet, Childswarm, Clumsy Cosplayer, Con Bro, El Supercast, Hater, Ghost Michelle, Model, One-Up, Shadow Player, Shipper, Skimmer, Soft Talker, Umm, Wanderer, Whale, Ze Regular

Boss Titan: Robot Kid

Strategy: Don't even attempt this without the 'Gain Max Rage equal to Bounty collected' Rage ability or you won't have a chance. Practically every customer on this shift has a bounty on them (mostly high-Loaf Models and Clumsy Cosplayers), so try to clear them as fast as possible to get the boost to your Max Rage. Models in particular give a hefty +8 when cleared.

Save your Deodorant Bomb for when you have 2+ Models in the store to clear their Annoying coatings and save the Freebie Giveaways until you have a full store (likely when the Childswarms enter). If you have a decent Max Rage buffer, Hey the Models and Clumsy Cosplayers when possible to clear them quicker.

Don't worry about keeping a clean store during this shift. Between the Clumsy Cosplayers and the Childswarms, it's a lost cause.

Customers: Bad Haggler, Buffet, Childswarm, Clumsy Cosplayer, Ghost Michelle, Hater, Model, One-Up, Shadow Player, Shipper, SimonSan, Skimmer, Soft Talker, Umm, Wanderer, Whale, Ze Regular

Boss Titan: Neo Scumbag

Strategy:

Customers: Whale, ???

Boss Titan:

Strategy:

Customers:

Boss Titan:

Strategy:

Notes: The name alludes to Black Friday.

Customers: All.

Boss Titan: None. Instead, each time you beat the maximum rank (you start at rank 0), the highest rank you can challenge goes up by 1 - but if you lose, you go down a rank, to a minimum of 0. (Multi-shifts do not allow you to skip ranks.) It is not possible to "progress" beyond this level, although beating rank 11 will earn Brothers In Arms.

Strategy:

Only available on Fridays, and only if you have unlocked Infinite; winning or losing will affect your Infinite rank. Multi-shifts are disallowed. The top 3 scorers on a week's Black Friday, who do not already have access to Black Friday Rewards under Wage Enhancements, gain said access.

Customers: All (except the Good Customers), and they come in at maximum volume on turn 2: you face 8 customers at all times until there are less than 8 customers left for the entire shift.

Boss Titan: None. The flood of customers is enough.

Strategy: You get turn 1 for One Peaceful Moment. Use it. After that, remember that you're not going for Rage, so do what tricks you can to minimize your Rage, such as Trapdoor for especially problematic customers such as Tsks and Cropdusters. If you are going for a high Wage score, spam BOGO - but make sure you can complete the shift. Don't forget to use a Sub-manager (the +11% for not using one is not factored into your Wage for Black Friday purposes).

Notes: The name references Black Friday.

Sub-managers

After completing the quest Leaving Work at Work (post-Tier 6), you may choose to take one of the following Sub-managers with you on a Shift. Each Sub-manager can be leveled up by purchasing their respective Rage upgrade, available at Tier 7 for 20,000 Rage.

Although the Sub-managers are also Allies, there is no game-mechanical connection: all three Sub-managers are available immediately after the Quest, even if you haven't obtained them as Allies, and their Sub-manager level is not related to their Ally level.

Ally
Effect
Requirements

None
+11% Wage/Rage if all Customers cleared
None

A A Ron
1X to one random Customer per turn
None

A A Ron Lvl. 2
2X, 1X to 2 random Customers per turn
Rage Ability

MC Stripeypants
+1 Clean per turn
None

MC Stripeypants Lvl. 2
+1 Clean, -1 negative Coating per turn
Rage Ability

Potatoes
-1 Rage per turn
None

Potatoes Lvl. 2
+1 Max Rage per turn
Rage Ability

Customers

Descriptors (Cat-eared, Clompy-shoed etc) do not appear to affect stats; their only purpose appears to be to identify different customers of the same type. If you get a second, third, etc. customer of the same type with the same descriptor, that customer will be prefaced with "2nd", "3rd", etc.

Bad Haggler

Bender

Buffet

Cardrat

Childswarm

Clumsy Cosplayer

Con Bro

Cropduster

El Supercast

Fanboy

Fangirl

Fighter

Ghost Michelle

Hater

MeowMeow

Model

One-Up

Shadow Player

Shipper

SimonSan

Skimmer

Soft Talker

Tsk

Umm

Wanderer

Whale

Ze Regular

Loaf: 5

Stinginess: 2

Bankroll: 2

Shifts: Late Night, Weekend Rush, National Holiday, The Dark Shift

Bad Haggler sees that things cost more than free. The horror! +3 Stinginess!

Bad Haggler : "I'll give you negative this price. YES PAY ME" +2 Rage!

Loaf: 8

Stinginess: 5

Bankroll: 2

Shifts: Move-in Weekend

Bender picks up a book from the shelf and just starts bending the cover! -1 Lost Sales, +1 Rage!

Bender bends away. Seriously, is this their job? -1 Lost Sales, +1 Rage!

Stinginess: 4

Bankroll: 2

Notes: Starts with Gooey

Shifts: Late Night, Weekend Rush, National Holiday, The Dark Shift

Buffet gets fresh gravy stains on everything! -1 Clean, +1 Rage!

Loaf: 4

Stinginess: 4

Bankroll: 1

Notes: Comes in 3 at a time(?)

Shifts: Move-in Weekend

Cardrat weighs packs of cards with a hand scale to determine the rare ones! +2 Rage!

Cardrat turns the pages of the singles binder super-hard! -1 Lost Sales, +1 Rage!

Loaf: 1

Stinginess: 2

Bankroll: 1

Bounty: 1

Shifts: National Holiday, The Dark Shift

Notes: Comes five at a time, once per shift. Seems to act half the time.

Childswarm pulls down a bunch of stuffs and laughs! -1 Clean, +1 Rage!

Childswarm babbles and points at things. Where are their parents? +1 Rage!

Loaf: 8

Stinginess: 6

Bankroll: 10

Bounty: 5

Shifts: Late Night, Weekend Rush, National Holiday, The Dark Shift

Cosplayer holds a loooong prop sideways, and TURNS AROUND. -1 Clean, +1 Rage!

Cosplayer trips, and their glitter-filled wig poffs you! +2 Rage!

Stinginess: 1

Bankroll: 2

Shifts: Training Schedule, Weekday Afternoon, Late Night, Weekend Rush, National Holiday, The Dark Shift

Notes: Always does one of their abilities, then checks out and leaves the next turn.

Con Bro regales you with stories of the con! +1 Max Rage!

Con Bro decides to get some extra stuff they saw at the con! +1 Bankroll!

Con Bro brings their purchases up and checks out! What a great customer! +X Bankroll!

Loaf: 5

Stinginess: 5

Bankroll: 4

Bounty: 3

Shifts: Dark Friday

Cropduster fouls up the whole store! They all became Stinky! (All customers gain Stinky coating, replacing any current coating)

Shifts: Move-in Weekend, National Holiday, ?

Stinginess: 3

Bankroll: 12

El Supercast makes sure everyone is having a great time! -1 Stinginess (Min 1) all!

El Supercast brings their purchases up and checks out! What a great customer! +X Bankroll!

If you use Hey, depending on how many times you have used Hey with El Supercast before (across any number of Shifts):

You say hey. They say "Hey Hey!" -0 Loaf, +0 Rage!

You say hey hey. They say "Hey Hey Hey!" -0 Loaf, +0 Rage!

You say hey hey hey. They say "Hey Hey Hey Hey!" -0 Loaf, +0 Rage!

You say hey hey hey hey. They say "Hey Hey Hey Hey Hey!" -0 Loaf, +0 Rage!

You say hey hey hey hey hey. They say "Hey Hey Hey Hey Hey Hey!" Hey, that's 11 Heys! Check your Quest menu! -0 Loaf, +0 Rage!

The last one repeats, and means you have unlocked Hey Hey Hey.

Stinginess: 3-4

Bankroll: 3-4

Shifts: Training Schedule, Weekday Afternoon, Late Night

Notes: Seems to act half the time.

Fanboy airs out their coat, barf! They became Stinky!

Fanboy puts something back in the wrong spot! +1 Rage!

Fanboy ponders that they could get the bootleg for cheaper.. +1 Stinginess!

Stinginess: 3-4

Bankroll: 3-4

Shifts: Training Schedule, Weekday Afternoon, Late Night

Notes: Seems to act half the time.

Fangirl puts something back in the wrong spot! +1 Rage!

Fangirl squees loudly, cracking the window glass! +2 Rage!

Loaf: 5

Stinginess: 4

Bankroll: 3

Shifts: Move-in Weekend

Fighter yells at you for how loud the store is with all the yelling! +3 Rage!

Loaf: 3

Stinginess: 5

Bankroll: 3

Shifts: Late Night, Weekend Rush, National Holiday, The Dark Shift

Notes: Leaves after less time than most customers.

Ghost Michelle is looking for a certain character. Hair color? No idea. Name? No idea. Boy or Girl? NO IDEA +1 Loaf!

Ghost Michelle : "DO YOU HAVE THIS ONE ANIME I DONT KNOW WHAT ITS CALLED" +3 Rage!

Loaf: 4

Stinginess: 4

Bankroll: 2

Bounty: 3

Shifts: Late Night, Weekend Rush, National Holiday, The Dark Shift

Hater goes on about how everyone in here is stupid. +2 Rage!

Hater talks about how Your Favorite Show sucks. +1 Rage!

Loaf: 10

Stinginess: 10

Bankroll: 3

Bounty: 5

Shifts: Dark Friday

MeowMeow meows and meows, ugh.. Action #X changed to Facepalm! (+1 Rage and nothing else)

Loaf: 10

Stinginess: 4

Bankroll: 3

Bounty: 8

Shifts: Late Night, Weekend Rush, National Holiday, The Dark Shift

Notes: Starts with Annoying

Model sighs, since the 10-year-old kit they want is out of stock.. +1 Loaf!

Model is rude to someone on their phone for not being pretty enough! +1 Rage!

Model asks for an application. "I look so great, you should hire me to just stand here." +1 Loaf!

Model takes corners too tightly, bumping things onto the floor! -1 Clean, +1 Rage!

Model roughly opens things and roots around in them without asking. +2 Rage!

Stinginess: 10

Bankroll: 4

Bounty: 3

Shifts: Late Night, Weekend Rush, National Holiday, The Dark Shift

One-Up loudly exclaims that his fanfic is better than whatever he is looking at. +2 Rage!

Stinginess: 2

Bankroll: 1

Notes: Actual name is the player's name back to front. Good Customer.

Shadow Player avoids eye contact, walking directly to what they need.. Don't they look a little like you? +1 Rage, +3 Max Rage!

Shadow Player catches something as it falls off a shelf and puts it back. Have they been here before? +1 Clean!

Loaf: 2

Stinginess: 4-5

Bankroll: 1

Shifts: Late Night, Weekend Rush, National Holiday, ?

Shipper interrupts a conversation to talk about how your favorite character should fall for their little sister! +1 Rage!

Shipper looks through one of the books and makes a gross comment! -1 Clean, +1 Rage!

Shifts: Move-in Weekend, National Holiday, ?

Stinginess: 3

Bankroll: 12

SimonSan recommends some great merch! +1 Bankroll All!

SimonSan brings their purchases up and checks out! What a great customer! +X Bankroll!

Stinginess: 8

Bankroll: 5

Bounty: 2

Shifts: Late Night, Weekend Rush, National Holiday, The Dark Shift

Skimmer finishes reading something, puts it back, and grabs the next one! +1 Rage!

Shifts: Late Night, Weekend Rush, National Holiday, The Dark Shift

Loaf: 2

Stinginess: 4

Bankroll: 4

Soft Talker says "pststpspt." What. "pstsptspsppsss." +1 Rage!

Soft Talker : "pssps-" IS IT THIS DO YOU WANT THIS WHYYY +1 Rage!

Soft Talker says "pststpspt." SERIOUSLY WHAT DO YOU WANT AAAGH +1 Rage!

Loaf: 6

Stinginess: 6

Bankroll: 3

Tsk tsk-tsks at the state of the store! +XX Rage! (Equal to Dirty level)

Stinginess: 8

Bankroll: 4

Shifts: Late Night, Weekend Rush, National Holiday, The Dark Shift

Umm is looking for something. "Ummmm…" +1 Rage!

Umm wants to ask something. "Ummmm…" +1 Rage!

Umm stares at absolutely nothing. "Ummmm…" +1 Rage!

Shifts: Late Night, Weekend Rush, National Holiday, The Dark Shift

Stinginess: 5

Bankroll: 2

Notes: Starts with Stinky

Wanderer complains about something for an hour.. +1 Stinginess All!

Wanderer just stares into space.. Stinginess set to 5! +1 Rage!

Shifts: Late Night, Weekend Rush, National Holiday

Stinginess: 50

Bankroll: 50

Notes: Clear for the trophy Land a Whale. Rare.

Whale sees something they haven't bought yet! +1 Bankroll!

Shifts: National Holiday, The Dark Shift

Stinginess: 3

Bankroll: 8

Ze Regular tidies up a bit! +1 Clean!

Ze Regular nods at you, knowing how the day is going. +1 Rage, +3 Max Rage!

The Phone

- Requires data on earliest/latest time it can ring

- Lowers Max Rage the longer its left ringing

:: You pick up the phone..

One of the following can happen:

:: ..and it's a phone order! +3 Sales!

:: ..and it's Stalkergirl! "Just wanted to hear the sound of your voice. And your breathing. Bye. *click*" Hot? +3 Rage, +5 Max Rage!

:: .."…would you like to change your credit card processor?" AUGH SPAM +2 RAGE

:: "Can you put something on hold for me? Oh, I'll NEVER actually come buy it. Do it anyway." +1 Rage, -1 Sales!

:: ..dead air, for an eternity. Then: "are you open?" O_O +1 RAGE

:: .."do you sell Hammers?" NO WE DO NOT SELL HAMMERS +1 RAGE!

:: ..and it's a dialtone! They just hung up! AAGH +1 RAGE

:: ..and it's NinjaMas music. WHY +2 RAGE

If you don't answer it, the penalty gets worse every turn:

:: Phone's still ringing.. +1 Rage!

:: Okay, the phone is REALLY getting to you! Answer it! -1 Max Rage!

:: RING RING RING RING RINNNNG -2 Max Rage!

Titans

Encounter text:

::Just as you are about to shut down for the night, you sense a presence..

::and <titan name> lurches in!

::Readying your Vertical Pricing Gear, you leap to the defense of the store!

Store damage appears to range from 8% to 12%.

Titan messages repeat after hitting the last message.

To do HP damage to a Titan, you must be behind them, in their square and use a Leap Attack. To get behind them, you may either use a Leap movement from two spaces away, which has a chance of landing behind them, or when in their square, you may strafe. With strafe, there is also a chance the Titan may trip you, preventing you from getting behind them that round. If you are not behind them, both Leap and regular attacks will only attack their efficiency.

▼ Strategy Turtle

▲ Strategy Turtle

Against most Titans, especially if you are playing lower than the maximum level you have unlocked, simply Attack and let the Titan come to you. (Early on, you only have so much time until the Titan reaches you, so you want to cram in as many Attacks as you can.) If you reduce it to below 10% efficiency before it reaches you (especially if it never moves, e.g. Corpses), Move Right to it (if you have precise Leap, make your final Move a 2-space using LEAP). Then Strafe (if necessary to get behind it), and LEAP Attack until it is defeated.

This strategy was submitted by WingedCat, and has a high success rate - except against the Titans for which other strategies are displayed. (Said strategies were developed in part because this did not work against them.)

▼ Strategy Take 'em down

▲ Strategy Take 'em down

1. You get x2 damage if you attack with rage and an additional x2 for attacking a titan while on the same square for a total of x4 damage.

2. Attacking a titan increases your dodge chance while also making it possible for you to harass the titan, lowering his hit chance.

3. The lower efficiency the greater the chance the Titan can lose his action all together and thrash around uselessly.

- Get right in their square and use that x4 bonus to drop that efficiency fast.

This method won every titan battle for Daeomyn until the tier 4 boss Crapit.

Non-Boss Titans

U-Fo

The Corpses

The Void

Kimmy

Horseface

Shovin' Buddies

Five Teens

Appears in: <tt>(list of shifts)</tt>

Starting Efficiency: 100%

Starting HP: 100

Strategy: U-Fo is one of the easier Titans. Jumping in and wailing on them tends to work well, although if you haven't inflicted much Efficiency damage, you may want to Leap out of its square before turns 5 and 8.

▼ Turn Sequence

▲ Turn Sequence

Turn 1:

:: They pick up an item, high into the air, peering at it..

Turn 2:

:: .."Nope." and drop it! They grab another item, lift it high..

:: They mess up the store! +X% Damage!

Turn 3:

:: .."Nope." and down it crashes! They screech, and turn towards you!

:: They mess up the store! +X% Damage!

Turn 4:

:: Their howls for new things to destroy pierces your ears!

(long range attack)

Turn 5:

:: They swing the remains of destroyed items around, looking for fresh items to destroy!

(short range attack)

Turn 6:

:: They lift and drop things with insane speed!

:: They mess up the store! +X% Damage!

Turn 7:

:: They leap towards you, hunting for new things!

(moves - how far?)

Turn 8:

:: They glare at you and open their claws wide!

Appears in: <tt>(list of shifts)</tt>

Starting Efficiency: 150%

Starting HP: 100

Strategy: The Corpses are only capable of long-range attacks, which cannot hit you while you are in their square. They also never move. Once you get right on top of them, you can swing away in perfect safety.

▼ Turn Sequence

▲ Turn Sequence

Turn 1

:: The Corpses slowly trundle across the store, leaving a trail of death..

Turn 2:

:: Oh no, one of them just burped, and it is wafting your way!

(long range attack)

Turn 3:

:: One of them raised their arm to get something, and your eyes immediately begin to water..

(long range attack)

Turn 4:

:: They got into a slap fight! You can see the juice fly as they land meaty blows - why do you even work here

(long range attack)

Appears in: <tt>(list of shifts)</tt>

Starting Efficiency: 100%

Starting HP: 100

Strategy: <tt>(…)</tt>

▼ Turn Sequence

▲ Turn Sequence

Turn 1:

:: slooowly walks toward you..

Turn 2:

:: you blink for a moment, and she's right on top of you!

Turn 3:

:: a dark void surrounds her, as she prepares to bend time!

(long range attack)

(short range attack)

Turn 4:

:: She grabs you and explains the show she is looking for! "there is this boy and he is wait no there is a girl they have a pet something wait it is a story about oh something" AAAH

<tt>(some more?)</tt>

(grab attack)

Turn 5:

:: The vortex of Forever continues, drawing you in! "no i dont want to buy it i just want to know there is a cat and i think he has to find four people the first was wait no it was five other people the first was a girl and she wait" AAAAAGH

(grab attack)

Appears in: <tt>(list of shifts)</tt>

Starting Efficiency: <tt>100</tt>%

Starting HP: <tt>100</tt>

Strategy: <tt>(…)</tt>

▼ Turn Sequence

▲ Turn Sequence

Turn 1:

:: The lady rushes to the nearest thing she can get her hands on!

(moves to next section)

Turn 2:

:: She grabs items and screams! "IS THIS KIMMY? IS *THIS* KIMMY!?"

(damages store)

Turn 3:

:: Hurling them aside, she rushes at you!

(moves to your position)

Turn 4:

:: She lunges desperately. "ARE YOU KIMMY?"

(attempts to grab)

Appears in: <tt>(list of shifts)</tt>

Starting Efficiency: <tt>100</tt>%

Starting HP: <tt>100</tt>

Strategy: <tt>(…)</tt>

▼ Turn Sequence

▲ Turn Sequence

Turn 1:

:: Horseface asks you an impossible trivia question from a show that's been out of print for a decade!

(long range attack)

Turn 2:

:: rushes at you!

(moves forward 2 spaces)

Turn 3:

:: Horseface flails! "YOU DONT KNOW WHY DO YOU EVEN WORK HERE"

(short range attack)

Turn 4:

:: Horseface pushes over display after display!

:: They mess up the store! +X% Damage!

Appears in: <tt>(list of shifts)</tt>

Starting Efficiency: 150%

Starting HP: 100

Strategy: Shoving buddies destroy the store very quickly. You must spam long range attack to drop their efficiency as fast as possible. Once their efficiency is gone move in for the kill. Trying to leap unto them with precise for a back-stab or charging them for melee will take too long and result in defeat

▼ Turn Sequence

▲ Turn Sequence

Turn 1:

:: You hear "HEY BRO THEY GOT CARTOON STUFFS BRO!" as the rowdy group shoves each other into displays!

:: They mess up the store! +X% Damage!

(moves forward 1 space)

Turn 2:

:: They rush a book stand, toppling it and falling over. "LOL BRO U GOT ME HAHAHAHA"

:: They mess up the store! +X% Damage!

(moves forward 1 space)

Turn 3:

:: The tall one looks as you, after setting his mustache on fire accidentally. "HEY MAN YOU GOT ANY SCISSORS?" He backhands a figure setup trying to put it out.

:: They mess up the store! +X% Damage!

(moves forward 1 space)

Turn 4:

:: "LOOK THEY GOT A RACING GAME" erupts from the ball of fists and elbows, and they bowl towards you!

:: They mess up the store! +X% Damage!

(moves forward 1 space)

Appears in: Shift 6, Shift 7… <tt>(requires Tier 7?)</tt>

Starting Efficiency: 100%

Starting HP: 200

Strategy: Move in close, beat on it to lower efficiency, strafe, and leap attack until dead.

▼ Turn Sequence

▲ Turn Sequence

Turn 1:

:: One of the Teens shoot a foam gun across the store for no reason!

(long range attack)

Turn 2:

:: One of them makes stupid noises and leaps across the store!

(moves forward 2 spaces)

Turn 3:

:: One of them screws up a show quote! "Azmataz Mercuron Zapdohs!"

(short range attack)

Turn 4:

:: One of them, staring at something while walking towards it, misjudges and knocks over a display!

:: They mess up the store! +x% Damage!

Turn 5:

:: One of them picks up something and goes off on their friends about how to pronounce the name (incorrectly!)

Boss Titans

Shift 1: The Shuffler

Shift 2: Lady Evil

Shift 3: Mister Stares

Shift 4: Crapit

Shift 5: Robot Kid

Shift 6: Neo Scumbag

Shift 7: Everybody Smokes

Shift 8: Ladies Evil

Starting Efficiency: <tt>??</tt>%

Starting HP: <tt>??</tt>

Strategy: Move in close, beat on it to lower efficiency, strafe, and leap attack until dead.

▼ Turn Sequence

▲ Turn Sequence

<tt>(needs documenting)</tt>

Starting Efficiency: <tt>??</tt>%

Starting HP: <tt>??</tt>

Strategy: Move in close, beat on it to lower efficiency, strafe, and leap attack until dead.

▼ Turn Sequence

▲ Turn Sequence

Turn 1:

:: Lady Evil digs in her purse, and throws a giant pen at you!

(long range attack)

Turn 2:

:: She lashes out at anything near her!

:: They mess up the store! +5% Damage!

(short range attack)

Turn 3:

:: Certain you "sold all the good stuff to everyone else", she trashes the place!

:: They mess up the store! +11% Damage!

Turn 4:

:: She swings her big purse around, knocking things over!

:: They mess up the store! +6% Damage!

(short range attack)

(moves forward 2 places)

Turn 5:

:: Reaching towards you, she asks if you have anything free just for her!

(grab)

Turn 6:

:: Lady Evil tosses something at you, accusing you of marking it up while she wasn't looking!

:: They mess up the store! +8% Damage!

(long range attack)

Starting Efficiency: 150%

Starting HP: <tt>??</tt>

Strategy: Move in close, beat on it to lower efficiency, strafe, and leap attack until dead.

▼ Turn Sequence

▲ Turn Sequence

Turn 1:

:: The Stare lasers toward you!

(long range attack)

Turn 2:

:: He barrels toward you, eyes bulging with certain doom!

:: They mess up the store! +X% Damage!

(moves fwd 2 places)

Turn 3:

:: He focuses his gaze downward, causing a shockwave!

(long range attack)

(short range attack)

Turn 4:

:: Silently, he leaps from display to display!

:: They mess up the store! +X% Damage!

Turn 5:

:: Mister Stares hisses at you!

:: They regain their footing! +X% Efficiency!

Starting Efficiency: <tt>150</tt>%

Starting HP: <tt>100</tt>

Strategies: While not actually a puzzle boss, Crapit can feel like it. Its short range attack sends you to the far end of the store, and its long range attack can cripple you. It is recommended that you have all Titan battle Rage upgrades before you fight Crapit.

These are just a few of several strategies for defeating it:

▼ Strategy Rush In

▲ Strategy Rush In

Move Right w/LEAP.

Move Right 3 more times. You should shed your fatigue and wind up 2 spaces away just as Crapit attacks.

Move Right w/LEAP. If you're lucky, you are now behind the Titan and can LEAP Attack for the win. Otherwise, you may be safely underfoot where you can Attack for increased harassment (it will take a few hits to get Crapit to under 100% efficiency, needed to have a hope of Strafing), or you may need to Move Left w/LEAP.

This strategy was submitted by WingedCat, and has a moderate success rate.

▼ Strategy Hit and Run

▲ Strategy Hit and Run

Move right until you are 4 spaces from the Crapit.

Use long range attacks until it fires its attack.

Leap twice to occupy the same square.

If Crapit is facing away, attack+leap until it dies or is facing you.

If Crapit is facing you, attack, until it asks how much the item is, then leap away.

After you leap away: If Fatigue ≤ 6, leap back into the Crapit's square and return to Step 4. If Fatigue > 6, move toward the Crapit twice normally, and return to Step 5.

As you lower its efficiency, the Crapit may attempt to move to the other side of the map, chase it while continuing to watch its actions until you get behind it or you whittle its efficiency down to 60% or whatever percent you feel comfortable with, whichever is less.

Once its efficiency is low enough, strafe behind it and finish it off.

This strategy was submitted by Xenos and has been shown to defeat Crapit without the player taking damage, but needs more testing.

▼ Strategy Safety First

▲ Strategy Go for Broke

Leap move then advance until you're 4 spaces away. This should be out of his long range.

Attack long range.

After his attack goes off, double leap in. If you're behind him you can go for the double tap win, but 2 minimum damage attacks (40) and you may be in trouble. Regular attacks also harass him making it easier to dodge or disrupt his second attack which has a four turn charge(two after your double leap), and after your double leap, you'll be right on him and taking advantage of the x4 bonus to harass him heavily and his second attack should miss/be dodged or be disrupted. If you get hit, go back to step 1.

Strategy courtesy of Daeomyn and has been tested to work with a high success rate4.

▼ Turn Sequence

▲ Turn Sequence

Turn 1:

:: Crapit peers at a single item intently.

(moves 2 spaces away from you)

Turn 2:

:: They open their mouth, and sloooowly turn to face you.

(nothing)

Turn 3:

:: "How much is this?" They look at the price..

(nothing)

Turn 4:

:: "THAT MUCH???" they fill with dark energy. "CRAPIT!"

(long range attack)

(short range attack - knocks you to the end of the store Crapit is furthest from, if it hits)

Starting Efficiency: 200%

Starting HP: 100

Strategy: Get in his square and start attacking him, until he has low Efficiency. Pay, attention to your HP 3rd,4rd,5th. Turn he, does a ton of damage, so use your +50 HP on the 4-5 turn.

▼ Turn Sequence

▲ Turn Sequence

Turn 1:

:: The Robot Kid grabs at everything, howling card game terms!

(grab)

Turn 2:

:: He starts, quite literally, taking apart the displays, and ripping things down from the walls!

:: They mess up the store! +X% Damage!

(grab)

Turn 3:

:: He mumbles and yowls - "CAN I BUY THINGS? FOR FREE? WHY NOT!?"

(long range attack)

(short range attack)

Turn 4:

:: Little Sage follows you, stomping. "WHY AREN'T YOU LISTENING TO ME FOREVER"

(short range attack)

(grab)

Turn 5:

:: He just starts opening packs in the middle of the store. Just opening them. What the heck!?

(long range attack)

(short range attack)

(grab)

<tt>more?</tt>

Starting Efficiency: 300%

Starting HP: 200

Note: Does 70-100(?) damage with attacks.

Strategy: You will probably have to have all available Rage upgrades to face Neo Scumbag. If, somehow, you have unlocked Neo Scumbag and have any Rage upgrades available to purchase, purchase them first. Neo Scumbag is one of the few titans that you don't want to get in close to until you're ready to bring him down as his short range attack is utterly devastating.

▼ Strategy Kite

▲ Strategy Kite

The point of this strategy is to not let Neo Scumbag be on the same space as you until you have disabled the Titan (gotten its efficiency to under 10%, preferably 0%). While following this strategy, if at any time you take damage, immediately use Five Minutes To Go. Neo Scumbag hits hard enough that not immediately healing gives a good chance of losing actions to injuries, giving the Titan a chance to catch up and defeat you.

Attack until Neo Scumbag is one space to your right.

Move Right w/LEAP. Continue until you are all the way across the store.

Attack (regenerating Fatigue) until Neo Scumbag is either below 10% efficiency or one space to your left.

If Neo Scumbag reaches one space to your left and still has significant efficiency, Move Left w/LEAP until you are all the way across the store, then Attack again.

Once Neo Scumbag is below 10% efficiency, Move to the Titan, using LEAP for the final two-space move, then Strafe if necessary, and Attack w/LEAP. Don't let the Titan's high HP faze you: once the Titan is disabled and you are behind it, you have time to make the extra attacks to whittle this extra HP off.

This strategy was submitted by WingedCat, and has a high success rate.

Note by Authority2: Neo Scumbag has a turn when he isn't attacking that comes just after the turn when he's two spaces away from you. Leaping right on him at that point, then leaping again works too to get you away without taking a hit. (Actually, doesn't Neo Scumbag get a chance to hit you with this strategy? Short-range attacks hit adjacent squares. Someone test it) Also, why not 0% efficiency? He killed me once when he was at 12% and I thought it was safe.

▼ Turn Sequence

▲ Turn Sequence

Turn 1:

:: Neo Scumbag's eyes gleam, chortling quietly..

(short range attack)

(grab)

Turn 2:

:: Neo Scumbag hops about, looking for someone to stand too close to!

(short range attack)

:: They mess up the store! +X% Damage!

(grab)

Turn 3:

:: Neo Scumbag daydreams of all the people he can creep on..

Turn 4:

:: Neo Scumbag's grabbity hands quest out to give the most uncomforable backrub of all..

(short range attack)

(grab)

Turn 5:

:: Neo Scumbag reaches out, creeping out customers and friends past and future!

(short range attack)

(grab)

Turn 6:

:: Neo Scumbag asks you for the number of every girl you know!

(short range attack)

(grab)

Turn 7:

:: Neo Scumbag stops to rummage through his pockets for a phone to save the numbers in..

Turn 8:

:: Neo Scumbag looks around for people to make fun of, creeper hands creeping!

(short range attack)

(grab)

Turn 9:

:: Neo Scumbag's eyes peer around wildly, and he grabs at books to complain about translations!

:: They mess up the store! +X% Damage!

(short range attack)

(grab)

Turn 10:

:: Neo Scumbag stops to think about what the worst thing in the store is..

Starting Efficiency: 300%

Starting HP: 200

Strategy: Sit in the back of the store, long range attack him until he reaches 0 Efficiency, then you can beat him with ease.

▼ Turn Sequence

▲ Turn Sequence

Turn 1:

:: Smokes inflates and deflates, releasing a toxic cloud! "EVERYONE SMOKES! YOU CAN'T NOT BUY MY BOOKS!"

:: They mess up the store! +X% Damage!

(long range attack)

(short range attack)

Turn 2:

:: Smokes inflates and deflates, releasing a toxic cloud! "EVERY BOOK I SMELL SMELLS LIKE SMOKE MY BOOKS ARE FINE"

:: They mess up the store! +X% Damage!

(short range attack)

Turn 3:

:: Smokes inflates and deflates, releasing a toxic cloud! "SINCE I SMOKE THAT MEANS ALL PEOPLE SMOKE SO TAKE MY BOX OF GROSS BOOKS"

:: They mess up the store! +X% Damage!

(short range attack)

Turn 4:

:: Smokes hurls gross used books at you! "WHY WON'T YOU PAY ME FOR THEEESE"

(long range attack)

Turn 5:

:: Smokes rushes you down, reaching out with oily claws!

(short range attack, grab)

Starting Efficiency: 300%

Starting HP: 200

Strategy: This being the final Titan, you will again have to have purchased all Rage upgrades before taking Ladies Evil on. It is strongly recommended that you have purchased all Wage upgrades too.

▼ Strategy Uberrage

▲ Strategy Uberrage

This time, you will simply overpower the Titan. The main threat is the Titan's grabs, which usually hit (if close enough) and take 5 Rage away each time (unless you are out of Rage, in which case you are defeated). The Titan will also be draining your HP, but there is not as much you can do about that.

Note that, aside from one upgrade, Rage against the Titan only reflects Rage actually accumulated during the shift: multi-shifts, high Wage, closing early, and other tricks you have been using to build the Rage you use to buy upgrades won't work here. So the first step is to end your shift with at least 100 Rage before any bonuses. (You can do it with less, but aiming for 100 Rage should not take much extra effort beyond clearing the shift. Also, the RNG seemed to be more favorable when starting with over 100 Rage, but this could have been a statistical anomaly.) A lot of Think Fasts are recommended, and don't be afraid to let most customers - whichever ones do not give you a hard time - linger a few more turns (so long as you still clear them out before shift end).

Once the Titan has been triggered (it seems to have a high - not quite 100%, but perhaps 90% - rate when you have all the Rage upgrades, have not yet beaten Ladies Evil, and clear Dark Friday, despite the interface saying 20%), just Attack. Let the Titan come - with one exception: when the Titan is 3 away, Move Right w/LEAP so you meet it at its next step (otherwise, the Titan's pattern will leave it sitting 1 away from you for a few turns, where you deal less damage). Make sure to use Five Minutes To Go as soon as you drop below 50 HP. With luck, you can get the Titan down to 0% efficiency without running out of Rage, HP, or store HP, at which point Strafe then Attack with LEAP as usual.

This strategy was submitted by WingedCat, and has not yet been tested much (at least by anyone willing to update this note with their results - it worked for WingedCat, though only about 1 time in 5). Use with caution, and be prepared to do multiple runs.

Note by Takumi: I tested it and it's not very effective; by the time it's on 0% your HP is too low to hit reliably. Besides, the titan can regain footing, lots of it (I don't remember the amount), and it's nearly impossible to get it back to 0.

People at the forum suggested to use the same strategy as with Neo scumbag, it worked much better.

Note by Ayashin: I've seen this titan regain as much as 93%.

Note by tn5421: I've seen it regain as much as 95%.

▼ Turn Sequence

▲ Turn Sequence

It is uncertain if this Titan follows a set turn sequence. The following have been observed without an apparently repeating pattern. The Titan moves in a consistent pattern, though.

:: Lady Evil and her all-female brood engulf a display!

(short range attack)

:: They mess up the store! +X% Damage!

(grab)

:: The multiheaded monster consumes everything in its path!

(short range attack)

:: They mess up the store! +X% Damage!

(grab)

:: Pulsating, the mass freezes above the last remaining free sample comic, as the heads fight over ownership!

:: An opened boxed set ejects from the mass, careening around the store!

(long range attack)

:: The Ladies Evil remove a snack from their purse, and all the heads take big wet bites of the same piece without wiping it off in-between!

(grab)

Upgrades

Rage Abilities

Upgrade
Cost

Tier 1

See # of Customers remaining
20 Rage

Start at +1 Clean
25 Rage

+5 Rage Max
25 Rage

+4 Time per Shift
30 Rage

Slack Off becomes Grumble (+2 Rage, +3 Max Rage)
30 Rage

+1 Wage per Rage at end of shift
50 Rage

Coming Through becomes Barge (Barge + no time passes)
50 Rage

Tier 2

+2% Max Long Range Damage
100 Rage

+2% Max Short Range Damage
100 Rage

+20% Short Range Dodge
125 Rage

+20% Long Range Dodge
125 Rage

Deep Breath becomes Death Stare (+2 Rage, +4 Max Rage)
150 Rage

+1 Action Options
150 Rage

New Action: Boot (Remove non-loafer from store)
150 Rage

New Action: New Release (3X, 1X to all others)
200 Rage

Tier 3

+1 HP per turn vs. Titans
350 Rage

Deodorant Bomb (Remove all coatings, no time passes, once per Shift)
350 Rage

New Action: BOGO (+1 Bankroll to all, no time passes)
450 Rage

+5 Rage on Titan Attack
450 Rage

+4 Time per Shift
450 Rage

+2% Max Short Range Damage
450 Rage

2x chance to overcome Injury
450 Rage

Disinfectant becomes Spot Clean (Spot Clean cleans store if it doesn't de-coat)
450 Rage

Tier 4

New Action: Entice (4X, +1 Bankroll)
500 Rage

Freebie Giveaways (2X to all, no time passes, once per Shift)
500 Rage

+1 HP per turn vs. Titans
600 Rage

+10 Rage Max
600 Rage

Leap becomes precise (Leap can get behind if lands in same position as Titan)
600 Rage

War Stories (Collect Bounty on selling to / booting bad customers)
750 Rage

+8 Time for Shift
750 Rage

Sell becomes Savings Punch (5X to one customer)
850 Rage

Tier 5

+1 Rage Armor (+1 Max Rage when you gain Rage)
1000 Rage

Cleansing Fire (Convert Dirty Level to Rage, no time passes, once per Shift)
1200 Rage

Gain Max Rage equal to Bounty collected
1100 Rage

Remove Action: Upsell
1300 Rage

New Action: HEY (Gain Rage equal to 1 Loafing customer, removes all Loaf, special result if used repeatedly on El Supercast)
1500 Rage

Tier 6

New Action: Waifu Call (6X to 1 customer)
1800 Rage

Promote becomes Coupon Kick (4X to 1 section)
2000 Rage

+10% Max Long Range Damage
2500 Rage

+10% Wage (may be a placeholder?)
3000 Rage

+10% Rage (may be a placeholder?)
3000 Rage

+1 Action Options (may be a placeholder?)
5000 Rage

Tier 7

+6 Time per Shift
6000 Rage

+10 Max Rage
6000 Rage

25% less Store Damage
7500 Rage

View S/B of Loafers
7500 Rage

Rare Action: Trapdoor (remove one customer (no bounty, once per basket))
8000 Rage

Entice becomes Hype (4X, +1 Bankroll, customer gains Hyped (2X per turn) coating)
8000 Rage

Be Helpful becomes Pitch (3x to all Customers on Left or Right half)
10000 Rage

+10 Max Rage
10000 Rage

+2% Max Long Range Damage
15000 Rage

+6 Time per Shift
15000 Rage

Sub-Manager Stripeypants Lvl. 2 (+1 Clean, -1 negative Coating per turn)
20000 Rage

Sub-Manager Potatoes Lvl. 2 (+1 Max Rage per turn)
20000 Rage

Sub-Manager A A Ron Lvl. 2 (2X, 1X to 2 random Customers per turn)
20000 Rage

Tier 8

Rare Action: The Voice (all customers with <6 L+S check out)
100000 Rage

Wage Enhancements

Upgrade
Effect
Cost

Tier 1

Steady Ride
+1 Shifts per day
200 Wage

Accountant
+1 Rage bonus per excess Sales
200 Wage

Tier 2

Gas Injectors
-1 Fatigue on Leap
500 Wage

Hidden Snack
+3 Max Fatigue
500 Wage

Five Minutes To Go
+50 HP, once per battle
500 Wage

Tier 3

Open Availability
+1 Shifts per day
2500 Wage

Tier 4

New Pricing Guns
+20 Backstab Damage
3000 Wage

Tier 5

Late-Night Delivery
+3 Max Fatigue
3500 Wage

Tier 6

N/A

Tier 7

N/A

Black Friday Rewards

Employee of the Week
10 point Trophy
100000 Wage

Once-per-day Bonuses

Poker Buddies
No Cards lost on failure in Poker5
200 Wage

Employee Benefits
Reroll all Good Manga results in Truckload
300 Wage

Discount Trading
Double first Electrum purchase in Pachinko
300 Wage

Candy Eyes
see 1 random Candy House in Candyween
500 Wage

Comped Party
+2 Juice Limit
500 Wage

Two Weeks Notice
Stinginess / Loaf halved, Wage/Rage rewards reduced to 1/4, no Infinite/Black Friday, lasts all day
11 Wage

Footnotes

1. Patterned after Attack on Titan, if you hadn't realized.

2. And also where the Actions are.

3. There are two different values named "Rage": in-shift Rage and out-of-Shift Rage. In practice, it should always be obvious from context which one is meant.

4. citation needed

5. This works even if you bet a card or fight with a boss.

page revision: 149, last edited: 04 Nov 2021 19:13

            Edit
Tags
Discuss (17)
History
Files
Print
Site tools
+ Options

    Edit Sections
    Append
    Edit Meta
    Watchers
    Backlinks
    Page Source
    Parent
    Lock Page
    Rename
    Delete

    Help
     |
    Terms of Service
     |
    Privacy
     |
    Report a bug
     |
    Flag as objectionable

Powered by Wikidot.com

                    Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License

        Click here to edit contents of this page.

        Click here to toggle editing of individual sections of the page (if possible).         Watch headings for an "edit" link when available.

        Append content without editing the whole page source.

        Check out how this page has evolved in the past.

        If you want to discuss contents of this page - this is the easiest way to do it.

        View and manage file attachments for this page.

        A few useful tools to manage this Site.

        See pages that link to and include this page.

        Change the name (also URL address, possibly the category) of the page.

        View wiki source for this page without editing.

        View/set parent page (used for creating breadcrumbs and structured layout).

            Notify administrators if there is objectionable content in this page.

            Something does not work as expected? Find out what you can do.

            General Wikidot.com documentation and help section.

            Wikidot.com Terms of Service - what you can, what you should not etc.

            Wikidot.com Privacy Policy.


text:
package org.kuali.kfs.module.endow.businessobject;

import org.kuali.rice.core.api.util.type.KualiDecimal;

public class TransactionDocumentTotalReportLine extends TransactionDocumentForReportLineBase {

    protected int totalNumberOfTransactionLines = 0;;

    public TransactionDocumentTotalReportLine() {
        this("", "", "");
    }

    public TransactionDocumentTotalReportLine(String documentType, String documentId, String securityId) {
        this.documentType = documentType;
        this.documentId = documentId;
        this.securityId = securityId;
    }

    /**
     * Gets the totalNumberOfTransactionLines attribute.
     * @return Returns the totalNumberOfTransactionLines.
     */
    public Integer getTotalNumberOfTransactionLines() {
        return totalNumberOfTransactionLines;
    }

    /**
     * Sets the totalNumberOfTransactionLines attribute value.
     * @param totalNumberOfTransactionLines The totalNumberOfTransactionLines to set.
     */
    public void setTotalNumberOfTransactionLines(int totalNumberOfTransactionLines) {
        this.totalNumberOfTransactionLines = totalNumberOfTransactionLines;
    }

    /**
     * Adds a income amount to the current income total
     * @param incomeAmount the income amount to add to the income total
     */
    public void addIncomeAmount(KualiDecimal incomeAmount) {
        this.incomeAmount = this.incomeAmount.add(incomeAmount);
        this.totalNumberOfTransactionLines++;

    }

    /**
     * Adds a principal amount to the current principal total
     * @param principalAmount the principal amount to add to the principal total
     */
    public void addPrincipalAmount(KualiDecimal principalAmount) {
        this.principalAmount = this.principalAmount.add(principalAmount);
        this.totalNumberOfTransactionLines++;
    }
}


text:
namespace dp
{
namespace vulkan
{
class VulkanVertexArrayBufferImpl : public VertexArrayBufferImpl
{
public:
  VulkanVertexArrayBufferImpl(ref_ptr<VertexArrayBuffer> buffer,
                              ref_ptr<VulkanObjectManager> objectManager,
                              BindingInfoArray && bindingInfo,
                              uint8_t bindingInfoCount)
    : m_vertexArrayBuffer(std::move(buffer))
    , m_objectManager(objectManager)
    , m_bindingInfo(std::move(bindingInfo))
    , m_bindingInfoCount(bindingInfoCount)
    , m_descriptorUpdater(objectManager)
  {}

  ~VulkanVertexArrayBufferImpl() override
  {
    m_descriptorUpdater.Destroy();
  }

  bool Build(ref_ptr<GpuProgram> program) override
  {
    UNUSED_VALUE(program);
    return true;
  }

  bool Bind() override { return true; }
  void Unbind() override {}
  void BindBuffers(dp::BuffersMap const & buffers) const override {}

  void RenderRange(ref_ptr<GraphicsContext> context, bool drawAsLine,
                   IndicesRange const & range) override
  {
    CHECK(m_vertexArrayBuffer->HasBuffers(), ());

    ref_ptr<dp::vulkan::VulkanBaseContext> vulkanContext = context;
    VkCommandBuffer commandBuffer = vulkanContext->GetCurrentRenderingCommandBuffer();
    CHECK(commandBuffer != nullptr, ());

    vulkanContext->SetPrimitiveTopology(drawAsLine ? VK_PRIMITIVE_TOPOLOGY_LINE_LIST :
                                                     VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST);
    vulkanContext->SetBindingInfo(m_bindingInfo, m_bindingInfoCount);

    m_descriptorUpdater.Update(context);
    auto descriptorSet = m_descriptorUpdater.GetDescriptorSet();

    uint32_t dynamicOffset = vulkanContext->GetCurrentDynamicBufferOffset();
    vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
                            vulkanContext->GetCurrentPipelineLayout(), 0, 1,
                            &descriptorSet, 1, &dynamicOffset);

    vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
                      vulkanContext->GetCurrentPipeline());

    size_t constexpr kMaxBuffersCount = 4;
    std::array<VkBuffer, kMaxBuffersCount> buffers = {};
    std::array<VkDeviceSize, kMaxBuffersCount> offsets = {};

    uint32_t bufferIndex = 0;
    for (auto & buffer : m_vertexArrayBuffer->m_staticBuffers)
    {
      ref_ptr<VulkanGpuBufferImpl> b = buffer.second->GetBuffer();
      CHECK_LESS(bufferIndex, kMaxBuffersCount, ());
      buffers[bufferIndex++] = b->GetVulkanBuffer();
    }
    for (auto & buffer : m_vertexArrayBuffer->m_dynamicBuffers)
    {
      ref_ptr<VulkanGpuBufferImpl> b = buffer.second->GetBuffer();
      CHECK_LESS(bufferIndex, kMaxBuffersCount, ());
      buffers[bufferIndex++] = b->GetVulkanBuffer();
    }
    vkCmdBindVertexBuffers(commandBuffer, 0, bufferIndex, buffers.data(), offsets.data());

    ref_ptr<VulkanGpuBufferImpl> ib = m_vertexArrayBuffer->m_indexBuffer->GetBuffer();
    VkBuffer vulkanIndexBuffer = ib->GetVulkanBuffer();
    auto const indexType = dp::IndexStorage::IsSupported32bit() ? VK_INDEX_TYPE_UINT32 : VK_INDEX_TYPE_UINT16;
    vkCmdBindIndexBuffer(commandBuffer, vulkanIndexBuffer, 0, indexType);

    CHECK_LESS_OR_EQUAL(range.m_idxStart + range.m_idxCount,
                        m_objectManager->GetMemoryManager().GetDeviceLimits().maxDrawIndexedIndexValue, ());

    vkCmdDrawIndexed(commandBuffer, range.m_idxCount, 1, range.m_idxStart, 0, 0);
  }

private:
  ref_ptr<VertexArrayBuffer> m_vertexArrayBuffer;
  ref_ptr<VulkanObjectManager> m_objectManager;
  BindingInfoArray m_bindingInfo;
  uint8_t m_bindingInfoCount = 0;
  ParamDescriptorUpdater m_descriptorUpdater;
};
}  // namespace vulkan

drape_ptr<VertexArrayBufferImpl> VertexArrayBuffer::CreateImplForVulkan(ref_ptr<GraphicsContext> context,
                                                                        ref_ptr<VertexArrayBuffer> buffer,
                                                                        BindingInfoArray && bindingInfo,
                                                                        uint8_t bindingInfoCount)
{
  ref_ptr<dp::vulkan::VulkanBaseContext> vulkanContext = context;
  return make_unique_dp<vulkan::VulkanVertexArrayBufferImpl>(buffer, vulkanContext->GetObjectManager(),
                                                             std::move(bindingInfo), bindingInfoCount);
}
}  // namespace dp