Image
  • Writing
    • Andy Gavin: Author
    • About my Novels & Writing
    • All Writing Posts
    • The Darkening Dream
      • Buy the Book Online
      • Sample Chapters
      • Reviews
      • Info for Reviewers
      • Press Coverage
      • Awards
      • Cast of Characters
    • Untimed
      • Buy Untimed Online
      • Book Trailer
      • Sample Chapters
      • Reviews
      • Info for Reviewers
      • Press Coverage
      • Awards
      • Cast of Characters
    • Scrivener – Writer’s Word Processor
    • iPad for Writers
    • Naughty Dark Contest
  • Books
    • Book Review Index
    • Favorite Fantasy Novels
    • Andy Gavin: Author
    • The Darkening Dream
      • Buy the Book Online
      • Sample Chapters
      • Short Story: Harvard Divinity
      • Reviews
      • Info for Reviewers
      • Press Coverage
      • Awards
      • Cast of Characters
    • Untimed
      • About the Book
      • Buy Untimed Online
      • Book Trailer
      • Sample Chapters
      • Reviews
      • Info for Reviewers
      • Press Coverage
      • Awards
      • Cast of Characters
    • Naughty Dark Contest
  • Games
    • My Video Game Career
    • Post Archive by Series
    • All Games Posts Inline
    • Making Crash Bandicoot
    • Crash 15th Anniversary Memories
    • World of Warcraft Endgames
    • Getting a Job Designing Video Games
    • Getting a Job Programming Video Games
    • Naughty Dark Contest
  • Movies
    • Movie Review Index
  • Television
    • TV Review Index
    • Buffy the Vampire Slayer
    • A Game of Thrones
  • Food
    • Food Review Index
    • Foodie Club
    • Hedonists
    • LA Sushi Index
    • Chinese Food Index
    • LA Peking Duck Guide
    • Eating Italy
    • Eating France
    • Eating Spain
    • Eating Türkiye
    • Eating Dutch
    • Eating Croatia
    • Eating Vietnam
    • Eating Australia
    • Eating Israel
    • Ultimate Pizza
    • ThanksGavin
    • Margarita Mix
    • Foodie Photography
    • Burgundy Vintage Chart
  • Other
    • All Posts, Magazine Style
    • Archive of all Posts
    • Fiction
    • Technology
    • History
    • Anything Else
  • Gallery
  • Bio
  • About
    • About me
    • About my Writing
    • About my Video Games
    • Ask Me Anything
  • Contact

Archive for March 2011 – Page 2

Making Crash Bandicoot – GOOL – part 9

Mar12

This is part of a now lengthy series of posts on the making of Crash Bandicoot. Click here for the PREVIOUS or for the FIRST POST. I also have a newer post on LISP here.

I’m always being asked for more information on the LISP based languages I designed for the Crash and Jak games. So to that effect, I’m posting here a journal article I wrote on the subject in 1996. This is about GOOL, the LISP language used in Crash 1, Crash 2, and Crash 3. GOOL was my second custom language. Way of the Warrior had a much simpler version of this. Jak 1,2,3 & Jak X used GOAL, which was a totally new vastly superior (and vastly more work to create) implementation that included a full compiler. GOOL (the subject of this article) was mostly interpreted, although by Crash 2 basic expressions were compiled into machine code. But I’ll save details on GOAL for another time.

[ Also I want to thank my reader “Art” for helping cleanup an ancient copy of this article — stuck in some mid 90s Word format that can no longer be read. ]

_

Making the Solution Fit the Problem:

AI and Character Control in Crash Bandicoot

Andrew S. Gavin

Copyright (c) 1996 Andrew Gavin and Naughty Dog, Inc.

All rights reserved.

Abstract

Object control code, which the gaming world euphemistically calls AI, typically runs only a couple of times per frame. For this kind of code, speed of implementation, flexibility, and ease of later modification are the most important requirements. This is because games are all about gameplay, and good gameplay only comes from constant experimentation with and extensive reworking of the code that controls the game’s objects. The constructs and abstractions of standard programming languages are not well suited to object authoring, particularly when it comes to flow of control and state. GOOL (Game Oriented Object LISP) is a compiled language designed specifically for object control code that addresses these limitations.

Video games are the type of program which most consistently pushes the machine and programmer to the limit. The code is required run at blinding speeds, fit in tiny memory footprints, have no serious bugs, and be completed under short schedules. For the ultra high performance 5% of functions which run most frequently there is no substitute for careful hand coding in assembly. However, the rest of the program requires much more rapid implementation. It is this kind of code which is the subject of this article.

Object control code, which is euphemistically called AI in games, typically runs only a couple of times per frame. With this kind of code, speed of implementation, flexibility, and ease of later modification are often more important than maximizing execution time. This is because games are all about gameplay, and achieving good gameplay is about writing and rewriting object code time and time again. Programming languages are not immutable truths handed down from on high, but tools created by people to solve particular tasks. Like any tool, a programming language must be right for the job. One would not attempt to turn a hexagonal nut with a pentagonal wrench, neither is it easy to write a program in a language not well suited to the problem. Sadly, most programmers have only been exposed to a small set of similar and inflexible languages. They have therefore only learned a small number of ways to customize these languages to the task at hand. Let us stop for a second and take look at the abstractions given to us by each of the common choices, and at what price. But first a word about assemblers and compilers in general.

Assemblers and compilers are programs designed to transform one type of data (the source language) into another (the target language). There is nothing particularly mysterious about them, as these transforms are usually just a bunch of tabled relationships. We call one of these programs a compiler when it performs some kind of automatic allocation of CPU resources. Since most commonly found languages are fairly static, the transform rules are usually built into the compiler and can not be changed. However, most compilers offer some kind of macro facility to allow customizations.  In its most general form a macro is merely a named function, which has a rule for when it is activated (i.e. the name of the macro). When it is used, this function is given the old piece of program, and can do whatever normal programming functions it wishes to calculate a new expression, which it returns to be substituted for the old. Unfortunately, most languages do not use this kind of macro, but instead create a new tiny language which defines all the functions which are allowed to run during macro expansion (typically template matching of some sort). With general purpose macros, any transform is possible, and they can even be used to write an entire compiler.

Almost all programmers have had some exposure to assembly language. An assembler basically serves the purpose of converting symbolic names into binary values. For example, “add” becomes 20. In addition, most allow simple renaming of registers, assignment of constants to symbols, evaluation of constant expressions, and some kind of macro language.  Usually these macro languages consist of template substitutions, and the ability to run simple loops at expansion time. Assembly directly describes the instructions interpreted by the processor, and as such is the closest to the chip which a software engineer can get. This makes it very tedious and difficult to port to a different a machine. Additionally, since it consists primarily of moving binary words between registers and memory, and performing simple operations on them, most people find it tedious and difficult to use for large programs. In assembly, all details must be tracked by hand. Since knowledgeable humans are smarter than compilers, albeit much slower, they are capable of doing a substantially better job of creating smaller more efficient code. This is true, despite the claims of the modern OS community, compilers are still only about half as good as a talented assembly programmer. They just save a lot of time.

Many programmers learned to program with Basic. This language has an incredibly simple syntax, and typically comes with a friendly interactive environment. These features make it easy to learn and use. It however has no support for abstractions of any sort, possessing only global variables, and no macro system. Globals are great for beginners because the whole abstract arena of scope becomes a non issue. However, the absence of lexical scoping makes the isolation of code (and its associated bugs) nearly impossible. There is however an important lesson in basic which has been lost on the programming community: interactive is good. Basic typically has an interpreted listener, and this enables one to experiment very quickly with expressions to see how they work, and to debug functions before they are put into production.

The standard programming language of the last few years is C. First and foremost C provides series of convenient macros for flow control, arithmetic operations, memory reference, function calling, and structure access. The compiler writer makes expansions for these that work in the target machine language. C also provides expression parsing and simple register allocation for assembler grade data objects (i.e. words). C code is reasonably portable between machines of a similar generation (i.e. word size). As an afterthought a preprocessor provides rudimentary textual macro expansion and conditional compilation. The choice not to include any of the hallmarks of higher level languages, like memory management (aka garbage collection), run time typing, run time linking, and support for more complex data types (lists, true arrays, trees, hash tables etc.) is a reasonable one for many tasks where efficiency is crucial. However, C is crippled by an inconsistent syntax, a weak text based macro system, and an insurmountable barrier between run time and compile time name spaces. C can only be customized via the #define operator and by functions. Unfortunately, this makes it impossible to do many interesting and easy things, many of C’s fundamental areas, structures, setting, getting, expressions, flow of control, and scope are completely off limits for customization. Since functions always have a new scope, they are not useful creating flow of control constructs, and #define is so weak that it can’t even handle the vagaries of the structure syntax. For those who know C very well it is often a convenient language, since it is good at expressions and basic flow of control. However, whenever complicated data structures are involved the effort needed is obscene, and C in unable to transfer this effort from one data type to another similar one.

Modern operating system and fancy programs are filled with scripting languages.  MS DOS batch language, the various Unix shell languages, perl, tcl etc. are all very common.  These are toy languages. They often have inconsistent and extremely annoying syntaxes, no scoping, and no macros. They were invented basically as macro languages for operating system shells, and as such make it fairly easy to concatenate together new shell commands (a task that is very tedious in assembly or C). However, their ambiguous and inconsistent syntaxes, their slow interpreted execution speeds, and the proliferation of too many alternatives has made them annoying to invest time in learning.  Recently a new abomination has become quite popular, and its name is C++. This monstrosity of a language attempts to extend C in a direction it was never intended, by making structures able to contain functions.  The problem is that the structure syntax is not very flexible, so the language is only customizable in this one direction. Hence one is forced to attempt to build all abstractions around the idea of the structure as class. This leads to odd classes which do not represent data structures, but instead represent abstract ways of doing. One of the nice things about C is that the difference between pointer and object is fairly clear, but in C++ this has become incomprehensibly vague, with all sorts of implicit ways to pass by reference. C++ programs also tend to be many times larger and slower than their C counterparts, compile much slower, and because C++ compilers are written in C, which can not handle flexible data structures well, the slightest change to the source code results in full compiles of the entire source tree. I am convinced that this last problem alone makes the language a severe productivity minus. But I forgot, since C++ must determine nearly everything at compile time you still have to write all the same code over and over again for each new data type.

The advent of the new class metaphor has brought to the fore C and C++’s weakness at memory management. Programmers are forced to create and destroy these new objects in a variety of bizarre fashions. The heap is managed by the wretched malloc model, which uses wasteful memory cookies, creates mysterious crashes on overwrites, and endless fragmentation.

None of these problems are present in Lisp, which is hands down the most flexible language in common use.  Lisp is an old language (having its origins in the 50s) and has grown up over the last 30 years with the evolution of programming. Today’s modern Common Lisp is a far cry from the tiny mainframe list of 30 years ago. Aided by a consistent syntax which is trivial to parse, and the only full power macro system in a commonly used language, Lisp is extremely easy to update, customize, and expand, all without fighting the basic structures of the language. Over the years as lexical scoping, optimized compilation, and object oriented programming each came into vogue Lisp was able to gracefully adopt them without losing its unique character. In Lisp programs are built out of one of the language’s built in data structure, the list.  The basic Lisp expression is the form. Which is either an atom (symbol or number) or a list of other forms. Surrounded by parentheses, a Lisp lists always has its function at the head, for example the C expression 2+2 is written as (+ 2 2). This may seem backwards at first, but with this simple rule much of the ambiguity of the syntax is removed from the language. Since computers have a very hard time with ambiguity, programs that write programs are much easier in Lisp.

Let me illustrate beginning with a simple macro.

(defmacro (1+ value)
	"Simple macro to expand (1+ value) into (+ 1 value).
	Note that backquote is used.  Backquote is a syntax
	sugar which says to return the 'quoted' list, all
	forms following a comma however are evaluated
	before being placed in the list. This allows the
	insertion of fields into a template.
	1+ is the operator which adds 1 to its operand
	(C uses ++ for this)."
  `(+ 1 ,value))

The above form defines a function which takes as its argument the expression beginning with 1+, and returns a new expanded expression (i.e. (1+ 2) > (+ 1 2)). This is a very simple macro because it merely fills in a template. However, if our compiler did not perform constant reduction we could add it to this macro like this:

(defmacro (1+ value)
	"Smarter macro to expand 1+.  If value is a number,
	then increment on the spot and return the new
	number as the expansion."
  (if (numberp value)
      (+ 1 value)
    `(+ 1 ,value)))

The form numberp tests if something is a number. If value is, we do the add in the context of the expansion, returning the new number as the result of the macro phase. If value is not a number (i.e. it is a variable or expression), we return the expanded expression to be incremented at run time.

These full power macros allow the programmer to seamlessly expand the language in new ways. For example, the lisp form cond can be implemented from if’s with a macro. Cond is a special form which is like a C “switch” statement except that each case has an arbitrary expression. For example:

(cond
  ((= temp 2)
   (print 'two))
  ((numberp temp)
   (print 'other number))
  (t
   (print 'other type)))

Will print “two” if temp is 2, “other number” if it is a number (other than 2), and “other type” otherwise. A simple implementation of cond would be as follows:

(defmacro cond (&rest clauses)
	"Implement the standard cond macro out of nested
	'if's and 'when's. t must be used to specify the
	default case, and it must be used last. This macro
	uses backquote's ,@ syntax which splices a list
	into the list below it. Note also the use of progn.
	progn is a form which groups multiple forms and has
	as it's value, the value of the last form. cond
	clauses contain what is called an implicit progn,
	they are grouped together and the value of the
	last one is returned as the value of the cond."
  (if (eq (length clauses) 1)
      (if (eq (caar clauses) t)
          `(progn ,@(cdar clauses))
        `(when ,(caar clauses)
            ,@(cdar clauses)))
    `(if ,(caar clauses)
         (progn ,@(cdar clauses))
       (cond ,@(cdr clauses)))))

This expands the above cond into:

  (if (= temp 2)
      (progn (print 'two))
    (cond
      ((numberp temp)
       (print 'other number))
      (t
       (print 'other type))))

After a single pass of macro expansion. The macro will peel the head off of the cond one clause at a time converting it into nested ifs. There is no way to use C’s #define to create a new flow of control construct like this, yet in a compiled language these compile time transforms are invaluable to bridging the gap between efficient and readable code.

GOOL (Game Oriented Object LISP) is my answer to the difficulties of using C and assembly for object programming. It is a compiled Lisp dialect designed specifically for the programming of interactive game objects. As a language it has the following features: Consistent syntax, full power macros, symbolic names, orthogonal setting/getting, layered computation, multiple ultra light threads, grouping of computations into states, externally introduced flow of control changes (events), small execution size, retargetable backend, and dynamic linking. The GOOL compiler is embedded in Allegro Common Lisp (an ANSI Common Lisp from Franz Inc. which I run on an Silicon Graphics workstation running IRIX). Common Lisp provides an ideal environment for writing compilers because you start off with parsing, garbage collection, lists, trees, hash tables, and macros from the get go. As a language GOOL borrows its syntax and basic forms from Common Lisp.  It has all of Lisp’s basic expression, arithmetic, bookkeeping, and flow of control operators.  These vary in many small ways for reasons of speed or simplicity, but GOOL code can basically be read by the few of us lucky enough to have been exposed to Lisp. GOOL is also equipped with 56 primitives and 420 macros which support its advanced flow of control and game object specific operations. Additional ones can be trivially defined globally or locally within objects, and are indistinguishable from more primitive operations.

The GOOL compiler is an modern optimizing compiler with all sorts of smarts built into various macros and primitives. It is a fully forward referenced single pass compiler. Unlike some other programming languages with single letter names, GOOL does not require you to define something textually before you use it, and you never need tertiary declarations (like prototypes). Computers are good at remembering things, and a compiler is certainly able to remember that you called a function so that it can check the arguments when it gets to the declaration of that function. GOOL is fully relocatable and dynamically linked. So it is not necessary to include code for objects which are not nearby in memory. C is so static, and overlays so difficult and incompatible, that almost no effort is made to do dynamic binding of code, resulting in much wasted memory.

The programming tasks involved in creating game object behaviors are very inconvenient under the standard functional flow of control implied by most programming languages. In the programming of game objects it is necessary for each object to have a local state. This state consists of all sorts of information: type, position, appearance, state, current execution state (program counter), and all types of other state specific to the type of object. From the point of view of a particular object’s code all this can be viewed as an object specific global space and a small stack. This state must be unique to a specific object because it is often necessary to execute the same code on many different copies of the state. In either C or assembly it is typical to make some kind of structure to hold the state, and then write various routines or code fragments that operate on the structure. This can be accomplished either with function syntax macros or structure references. GOOL on the other hand allows this state to be automatically and conveniently bound to variable names for the most straightforward syntax. For example the C:

object >transx = object >transx + immediate_meters(4);

becomes in GOOL the similar expression:

(setf transx (+ transx (meters 4)))

However if in C one wished to add some new named state to each instance of a particular object one would have to create new structure records, accessors, initializers, memory management etc. GOOL on the other hand is able to easily allocate these on the object’s local stack with just one line of code, preserving the data there from frame to frame as well. A standard programming language like C only has one thread of control. While this is appropriate for the general case, it is inappropriate for objects, which are actually better expressed as state machines. In addition, it is extremely useful to be able to layer ultra light weight threads of execution, and to offer externally introduced transfers of control (events). While threads typically complicate most applications programs with few benefits, they are essential to the convenient programming of game objects, which often have to do several things at once. For example, an object might want to rotate 180 degrees, scale up toward 50%, and move toward the player character all at once. These actions do not necessarily take the same amount of time, and it is often useful to dynamically exchange and control them. In traditional code this is very awkward.

The basic unit of code in GOOL is a code block (or thread). These often do simple things as above. An arbitrary number of these may be combined into a state, they may be borrowed from other states, and activated and deactivated on the fly. For example:

(defgstate turn scale and move toward
	:trans	(defgcode (:label turn 180)
		; set the y rotation 10 degrees closer to 180 degrees
			(setf roty (degseek roty (deg 180) (deg 10))))
	:trans	(defgcode (:label scale to 150 percent)
		; set the x,y, and z scales 10% closer to 150% scale
			(with vec scale
				(seekf scale (scale 1.5) (scale .1))))
	:trans	(defgcode (:label move toward target)
		; set the x,y, and z position closer to the target's
		; (another object) position at a rate of 5 meters per second
			(with vec trans
				(seekf trans (target trans) (velocity (meters per sec 5)))))
	:code	(defgcode (:label play animation)
		; play the animation until this object is colliding with
		; another, then change states
			(until (status colliding)
				(play frame group animation))
				(goto collided)))

A :trans block is one which runs continuously (once per frame), and a :code block is one which has a normal program counter, running until suspended by a special primitive (frame), as in “frame is over.” These code blocks can be run as threads (as above), called as procedures, converted to lambda’s and passed to something (function pointers), and assigned to be run under special conditions (events or state exit). In this example is also illustrated the kind of simple symbolic notation used in GOOL to make object programming easier. Vectors like rotation, translation, and scale are bound to simple symbolic names (e.g. roty is the y component of the rotation vector). Many new arithmetic operations have been defined for common operations, for example, seek, which moves a number toward another number by some increment, and seekf its destructive counterpart.

GOOL also has a sophisticated event system.  It is possible to send an event (with parameters) to another object or objects. The object may then choose to do what it wishes with that event, run some code, change state, ignore it, etc., and report something back to the caller. These event handlers can be bound and unbound dynamically, allowing the object to change its behavior to basic events very flexibly.  For example:

:event	(defgcode (:params (event params))
		(reject-event-and-return
			((and (event is hit on the head)
				(< (interrupter transy) transy)))))

Says to ignore the hit on the head event when the interrupter (sender) is below the receiver in the y dimension.

Another feature illustrated here is the indirect addressing mode, (interrupter transy), in which a variable of another object (whose pointer is in the variable interrupter) is accessed. Operations can locate and return object pointers, which can be used as parameters. For example:

(send event hit on the head (find the nearest object))

which sends hit on the head to the nearest object or:

(let ((target (find the nearest object)))
	(when (and target (type target turtle))
		(send event hit on the head)))

which sends hit on the head to the nearest object only if it is a turtle.

It is the GOOL compiler’s responsibility to turn this state into code that executes the abstraction (the above state becomes about 25 words of R3000 assembly code).  GOOL code is typically much smaller than traditional code for similar tasks because the compiler does all the book keeping for this interleaving, and it is all implicit in the runtime product.  In addition it has a degree of code reuse which is practically unachievable in a normal language without extremely illegible source.

GOOL has full power macros which allow the language to be brought up to the level of the problem.  For example, many game programming tasks are more descriptive than a language like C is designed for. The following code causes a paragraph of text to appear on the bottom of the screen and scroll off the top.

(credit list (1 14)
	("AFTER THE")
	("DISAPPEARANCE")
	("OF HIS MENTOR,")
	("DR. NITRUS BRIO")
	("REDISCOVERED HIS")
	("FIRST LOVE:")
	(blank 1)
	("TENDING")
	("BAR"))

It does this by expanding into a program which creates a bunch of scrolling text objects as follows:

(defgopm credit list (params &rest body)
	"This macro iterates through the clauses in its
	body and transforms them into spawn credit line
	statements which create new credit line objects.
	It book keeps the y position down ward by height
	each time."
   (let ((list)
        (y 0)
        (font (first params))
        (height (second params)))
     (dolist (i body)
        (cond
          ((listp i)
           (case
             (car i)
             (blank (incf y (second i)))
             (t (push (append '(spawn credit line)
                               (:y ,y :font ,font :h ,height))
                      list)
                (incf y 1))))))
     `(progn ,@(reverse list))))(defgopm spawn credit line (line &key (y 0) (font 0) (h 18))
  "This macro is purely syntactic sugar, making the above macro somewhat easier."
  (spawn 1 credit line
     (frame num ,line)
     (unit ,(* y h)) ,font))

The following state is the code for the actual credit line.  When one of these credit line objects is spawned it creates a line of text. It then proceeds to use it’s trans to crawl upward from the starting y position until it is off the screen, in which case it kills itself.

(defgstate credit line (stance)
  :handles (spawn credit line)
  :trans (defgcode ()
           (unless first frame
              (setf transy ((parent transy) transvy))
              (when (> transy (unit 140))
              (goto die fast))))
  :code  (defgcode (:params (text frame y font))
           (stomp action screen relative)
           (set frame group text)
           (setf transvy y)
           (setf transy ((parent transy) transvy))
           (sleep text frame)))

As a conglomerate the above code manages to create a scrolling paragraph of arbitrary length from a descriptive block of code.  It does this by using the macro to transform the description into a program to create a cluster of new line objects.  This line objects take their simple behavior and amplify it into a more substantial effect when they are created in concert. In a conventional language it would be typical to create some kind of data structure to describe different actions, and then interpret that. C in particular is a very poor language for description. Because C’s only complex data type, the structure, can not even be declared in line (e.g. “struct foo bar={1,0}” is not legal except as a global) it is extremely awkward to describe complex things. It must be done with code, and the poor textual macro expander is not up to this. Witness the wretchedness of descriptive APIs like that of X windows. The contortions necessary to describe widget creation are unbelievable. Is it no wonder that people prefer to do interface work with resource files or Tcl/Tk which are both more descriptive in nature?

Overall, having a custom language whose primitives and constructs both lend themselves to the general task (object programming), and are customizable to the specific task (a particular object) makes it much easier to write clean descriptive code very quickly. GOOL makes it possible to prototype a new creature or object in as little as 10 minutes. New things can be tried and quickly elaborated or discarded. If the object doesn’t work out it can be pulled from the game in seconds without leaving any hard to find and wasteful traces behind in the source. In addition, since GOOL is a compiled language produced by an advanced register coloring compiler with reductions, flow analysis, and simple continuations it is at least as efficient as C, more so in many cases because of its more specific knowledge of the task at hand.  The use of a custom compiler allows to escape many of the classic problems of C.


A new 10th Crash post can be found HERE.

If you liked this post, follow me at:

My novels: The Darkening Dream and Untimed
or the
video game post depot
or win Crash & Jak giveaways!

Latest hot post: War Stories: Crash Bandicoot

Related posts:

  1. Making Crash Bandicoot – part 4
  2. Making Crash Bandicoot – part 1
  3. Making Crash Bandicoot – part 5
  4. Making Crash Bandicoot – part 6
  5. Making Crash Bandicoot – part 3
By: agavin
Comments (167)
Posted in: Games, Technology
Tagged as: Andy Gavin, Artificial intelligence, Central processing unit, Common Lisp, Compiler, Crash Bandicoot, Crash Bandicoot 2: Cortex Strikes Back, Crash Bandicoot 3: Warped, Gool, Languages, Lisp, Lisp Programming, Machine code, Macro, Macro (computer science), Naughty Dog, Programming, Programming language, pt_crash_history, Run time (computing), Scope (programming)

Brunch at Tavern 3D

Mar11

Restaurant: Tavern [1, 2, 3, 4]

Location: 11648 San Vicente Blvd, Los Angeles, CA 90049. (310) 806-6464

Date: March 6, 2011

Cuisine: Market driven Californian

Rating: Not just your typical short order brunch — but better.

 

Tavern is a favorite midend brunch spot of ours. It’s much yummier than the typical short order grills, and not as gluttonous as the high end brunches (like this). I’ve reviewed it twice before HERE, HERE, and HERE, but the menu is seasonal and so always changing a bit.

Today’s menu. Online version can be found HERE, but it’s always changing and never current.

Double cap. Not a bad restaurant cappuccino.

Simple pancakes for the boy (2.4 years old).

“Brisket hash with fried eggs and horseradish cream.” In its own way, a variant on the beef and horseradish tradition. But… um richer… and more breakfasty.

“Market fish (salmon) with carrot purée, gingered beets and lime salsa.” I didn’t try it, but looked very good with a really nice selection of fresh ingredients.

“Pumpkin waffle with pecan butter and maple syrup.” What could go wrong with this?

“Smoked fish with toasted rye & redwood hill goat cheese.” A very nice fish plate. The fish is fresh, and the goat cheese a nice improvement on cream cheese. I also like the very crunchy pickles.

“The Angeleno sandwich, artichokes, buratta, cavola nero, and meyer lemon. With prosciutto added.” I modified this vegetarian sandwich to add the good stuff (ham), and it turned out fantastic. The bread had the prefect texture and the burrata (more on that HERE), combined perfectly with the prosciutto and the marinated artichokes. The chips and pickles were awesome too.

“Fried Potatoes.”

“Sauteed Cavola Nero.” This wasn’t on the menu, but they did it anyway. The green is a kind of Italian Kale.

The dessert menu.

“Carrot cake with toasted walnuts and cinnamon anglaise.” Top example of the type, with a bit of creme anglaise in case the icing wasn’t rich enough.

“Snickers Bar, salted peanut caramel and vanilla ice cream.” Very nice dessert. Inside the hard dark chocolate shell was a kind of peanut and carmel mouse.

Tavern continues to hold up as a top breakfast spot, and pretty reasonable considering the level of sophistication.

Related posts:

  1. Brunch at Tavern – again
  2. Quick Eats: Brunch at Tavern
  3. Figs are in Season
  4. Gjelina Scores Again
  5. January in Paradise Cove
By: agavin
Comments (3)
Posted in: Food
Tagged as: Artichoke, Brentwood, Brisket, Brunch, California, Cooking, Cream Cheese, Dessert, Farmer's Market, Food, Goat milk cheese, Los Angeles, Prosciutto, Restaurant, Restaurant Review, side dishes, Tavern, Tavern Brentwood, Tavern La, vegetarian

La Sandia

Mar10

Restaurant: La Sandia

Location: 395 Santa Monica Place 305N,Santa Monica, CA 90401. Tel. 310.393.3300

Date: March 5, 2011

Cuisine: Mexican

Rating: Tasty, but some serious service issues need working out.

 

I’ve been questing through the various new offerings in the retrofitted Santa Monica place. I’ve already reviewed Xino (pseudo Chinese) and Zengo (Latin-Asian fusion), and next up is La Sandia, which is a modernized Mexican.


The upscale Disneyland-style decor ain’t half bad. But we did start off on a slightly sour note. They don’t take reservations on weekends, as I was told on the phone, “because they get so busy.” This always gets my blood boiling, because it’s basically like saying, “We don’t care about you (the customer), we just want to pack you into our bar and milk a couple extra drinks out of you.” I have long refused to go to places like Cheesecake factory on this basis as they adopt clearly “non user-friendly” policies to their own benefit. I was also told there was a wait of 5-10 minutes for a table of 2, when I could clearly see empty tables.

In a place that doesn’t take reservations?

We were in a rush for a movie so I bullied the hostess past this and we sat immediately. Not my preference but I hate that kind of crap and I was already in a mood.


The PDF version of the menu is HERE. Pretty big menu here of traditional Mexican items and some reinterpreted.

Chips. Pretty typical, but the salsa was good, cooked down the way I like it.

Cadillac margarita on the rocks, no salt. This was a nicely made margarita. The lime wasn’t that nuclear green crap and I could taste the tequila — which wasn’t the cheap stuff.

Now a note here. We were in a rush to get to a movie, and the parking had taken longer than we expected, so we told them we were in a hurry. This is a bit of a stress test for restaurants. The ultimate prize winner in this category, BTW, is Ortolan who flawlessly pounded through a huge prixe fixe in just over an hour. Overall La Sandia did fine with the speed, although they made us wait 20-25 minutes and then dumped all four dishes (2 appetizers and 2 entrees) simultaneously. Why they couldn’t have brought the appetizers 10 minutes earlier (a salad and a pre-prepped pastry) is anybodies guess. As I said, we got out of there in totally reasonable time, but they could have paced it better.

“LA SANDIA SALAD, arugula / cranberry / caramelized walnuts / goat cheese /pasilla-balsamic vinaigrette.”

“BEEF & CHORIZO EMPANADAS, braised beef / chorizo / raisins / oaxaca cheese / almond / crema fresca / chipotle sauce.” Very tasty. The outside was soft and buttery, and the inside rich and meaty. The sauce and the crema cut this nicely too. Exactly what I was looking for in this dish.

“ACHIOTE SALMON, grilled salmon / mild spice-citrus marinade / chile morita sauce /tomatillo-mango salsa / sweet corn tamal / charro beans.”

“SHRIMP AND AVOCADO SALAD, avocado stuffed with sauteed citrus-adobo shrimp / corn relish / cilantro pesto / chile chipotle aioli.” This was a fairly tasty and light shrimp and avocado salad. Perfect for a light lunch. The catch is, I didn’t order it.

I had ordered the Chipotle Shrimp entree. Now the room was very loud, and even though I repeated it 3-4 times I can understand the waitress making the error. The problem was that when she set it down I told her it was wrong and she said, “No it isn’t, there’s Chipotle in the dressing,” or some such nonsense. She then scooted away.

I ate it anyway because we didn’t have time, but I HATE that kind of BS. I don’t mind an honest mistake, they happen, but don’t try to snow the customer as to what he ordered. On a separate service note, I had ordered another Margarita in the gap waiting for the food but it came 15-20 minutes later with the check — after we had finished all our food.

I don’t like to sound petty, but this is a restaurant review, and drink timing is one of my pet peeves. Why would I want to pound an entire drink as I stand up to leave?

In any case, I called over the manager over the entree issue — something I do only about once a year — and he was very nice and apologetic and pulled the salad from the bill. Really I shouldn’t have paid for the second drink either, but I didn’t want to get into it. I do give him points for compensating correctly for the mistakes. He did fine by me, but the staff should NOT try and Jedi-mind-trick a customer into thinking he ordered something he didn’t.

Overall, the food here was pretty tasty. It’s owned by the same group as Zengo (which is hidden behind it), and while not as good, does maintain a solid kitchen. They have some serious service issues to work through, although it’s always possible it was a bad night. I’ll try it again at some point, I’m essentially a food based eater, and really find service mistakes to be more of an academic exercise in management problems than an actual irritation. Xino across the way had some similar problems in that we ordered about 10 small dishes and they delivered 90% of them simultaneously instead of 2-3 at a time! As someone who has eaten out at restaurants between 4 and 15 times a week for over thirty years, from taco shacks to Michelin 3 stars, I’ve pretty much seen it all.

Related posts:

  1. Figs are in Season
  2. Mall Eclectic – Zengo
  3. Quick Eats: Brentwood
  4. Fraiche take on Franco-Italian
  5. Quick Eats: Caffe Delfini
By: agavin
Comments (1)
Posted in: Food
Tagged as: Avocado, Cadillac Margarita, Cook, Fish and Seafood, Food, Fusion cuisine, La Sandia, Mexican cuisine, Restaurant, Restaurant Review, Santa Monica California, Santa Monica Place, side dishes, vegetarian

Book and Movie Review: The English Patient

Mar09

The English PatientTitle: The English Patient

Author: Michael Ondaatje

Genre: Literary Historical Drama

Length: 82,000 words, 300 pages, 162 min

Read: Spring, 2010

Summary: Lyrical.

_

I had seen the film when it came out (and several times after) and it’s long been one of my absolute favorites. So to that effect the novel has been sitting on my shelf for over ten years waiting to be read and this spring I finally got around to it. In some ways I’m glad I waited because I wouldn’t have appreciated the prose as much years ago. The voice, told in lightweight third person present, and lacking nearly all mechanical constructs (like dialog quoting or tagging, preamble explanations of scene transitions, etc.) has a breezy lyrical quality to it. It can only be described as delectable. There is a feel of watching a beautiful but flickery film, a series of stuccato images flash through your head as you read it. It’s worth quoting to illustrate:

“She stands up in the garden where she has been working and looks into the distance. She has sensed a shift in the weather. There is another gust of wind, a buckle of noise in the air, and the tall cypresses sway. She turns and moves uphill towards the house, climbing over a low wall, feeling the first drops of rain on her bare arms. She crosses the loggia and quickly enters the house.”

The plot — such as it is — involves a war battered Canadian nurse lingering in Italy at the close of WWII. She has isolated herself in a half destroyed villa and cares for a mysterious burn patient who is dying and too fragile to move. The book focuses on the nurse as its protagonist, concentrating on her relationship with an Indian (via the British army) bomb disposal tech and her efforts to come to terms with the war and loss. The patient slowly unravels his own tale to her. It is his story, set mostly in Egypt before and during the start of the war, which is the primary focus of the movie. In the book it serves more to offset and focus the nurse’s point of view.

I am blown away by the effort of translating this book for the screen. Frankly, although I loved the novel, I like the film better — this is rare. Anthony Minghella managed the near impossible, translating this gorgeous prose into an equally lyrical visual style. It’s less stuccato, more “lush and languid.” Film is a more linear medium, and Minghella focuses the story to create grander more visual arcs. To do this, he expanded the patient’s epic story of love and loss in pre-war Egypt. I’m a sucker for Egypt, the exotic, the British Empire in decay, and worlds that no longer exist. This story feels bigger than the nurse’s, being as it is more tied in with history and international events. But in both you have a powerful sense of people fighting for their passions, both interpersonal and intellectual, despite the baggage of past choices and the buffeting blows delivered by the unstoppable forces of history.

Both variants of this story are inherently complex, ambiguous, and emotional works. Look for no answers here, just gorgeously rendered questions.

Related posts:

  1. Book and Movie Review: Harry Potter and the Deathly Hallows
  2. Book and Movie Review: Let Me In
  3. Book and Movie Review: The Road
  4. Book and Movie Review: Twilight
  5. Movie Review: Adventureland
By: agavin
Comments (3)
Posted in: Books, Movies
Tagged as: Anthony Minghella, books, British Empire, Egypt, English Patient, Fiction, History, Italy, Literary, Literature, Michael Ondaatje, reviews, The English Patient, World War II, WWII

Zengo 2 – part deux

Mar08

Restaurant: Zengo [1, 2, 3]

Location: 395 Santa Monica Place, Santa Monica, CA 90401. Tel. 310.899.1000

Date: March 4, 2011

Cuisine: Latin-Asian Fusion

Rating: Color me confused — It’s in a mall, and it’s pretty good.

ANY CHARACTER HERE

A month to the day after my first visit (REVIEW HERE), I went back to Zengo. As I discussed previously, this is a slightly commercialized but pretty tasty mall restaurant whose appearence has accompanied the rooflift of Santa Monica Place. This one is Latin-Asian fusion. Sort of Asia de Cuba meets Rivera.

Today’s menu. PDF version HERE. The menu is pretty much all tapas style (hooray!) where you order 3 or so dishes per person and share them all.

“Hot & sour egg drop soup, foie gras-pork dumplings / enoki / green onion.” This is one of two repeats from last time. It had a very inserting note to the sour, from tamarind I think. The richness of the dumplings too is very nice as is the texture of the enoki.

“Thai shrimp lettuce wraps, chorizo / peanut / cilantro / tamarind chutney.” The second repeat. All three ingredients are combined like most “Thai wraps.”

Close up. The shrimp has a nice crunch and texture. The sauce is tamarind, and quite sour. Overall very nice.

“Peking duck-daikon tacos, duck confit / curried apple / orange-coriander sauce.” These were YUMMY. The meat was very soft and BBQ flavored. You could hardly tell it from some good Carolina style BBQ-pork, but it wasn’t pork (duck). The sauce is light and sweet, the apple mostly for texture, and the daikon an interesting and very slick and cool (it’s wet) take on a taco.

Close up. The smoked flavor of the meat comes through strong, and it’s darn good. The other elements provide complementary notes and texture.

“Achiote-hoisin pork arepas, corn masa / avocado / crema fresca.” These are serious flavor bombs. The meat tastes a bit like a good short rib, and goes perfectly with the typical pairing of avocado and crema fresca. There is just a bit of heat from the chilies.

“Scallops al mojo de ajo, roasted corn-edamame salsa / bacon, cotija cheese / roasted garlic soy, yuzu-sriracha aioli.” Probably the least successful dish of the lot, but certainly not bad. The scallops themselves were tasty. The rest was like a slightly coleslaw’ish succotash, with bacon chunks. The bacon was really good though — when isn’t it?

“Pork carnitas rice noodles, pork shoulder / mushroom / cashew / soft egg / hot ’n sour sauce.” Another winner. The noodles are tossed first, allowing the poached egg to break an coat them with yolk — Korean style? These overall had a really nice flavor: salty savory. Like Thai egg noodles with meat, but with more things going on.

As I said last thing, Zengo is not subtle cuisine, it’s full of crazy bold flavor combos. But I’m still impressed, and doubly so considering it’s a mall restaurant. The all tapas style menu gets my vote too because I’m sometimes a more is more kind of guy, and I hate getting stuck with just two dishes.

If you enjoyed this, check out the previous REVIEW HERE, or just across the deck the interesting Dimsum Xino.

Related posts:

  1. Mall Eclectic – Zengo
  2. La Cachette Bistro part deux et trois
  3. Finally, Modern Dim sum in Santa Monica
  4. Red Medicine is the Cure
  5. Rustic Canyon 3D
By: agavin
Comments (3)
Posted in: Food
Tagged as: Barbecue, bbq, Cooking, Egg Drop Soup, Foie gras, Fusion cuisine, Home, Santa Monica California, Santa Monica Place, Zengo

Done Again, Hopefully

Mar07

My freelance editor, the awesome Renni Browne, has officially declared my novel, The Darkening Dream, done, and ready for agents!

Now bear in mind that “done” is a highly subjective term, and that as soon as anyone gives me an idea worth doing, I’ll probably do it, and that agents and editors are bound to ask for changes. Which as long as I think the ideas make the book better, is a good thing.

The new version is 5.00i, but this is my ninth full major draft. Woah.

I remember reading Sol Stein‘s awesome book on writing, where he mentioned that The Magician took 10-11 drafts (I was then on my second) and thinking: that’s crazy! I guess not. Totally coincidentally, Renni also edited that novel, published in 1971!

So it’s been a busy week, working only on The Darkening Dream (I’ll get back to my new novel shortly). In the last 10 days:

1. We finishing our big line edit

2. I rewrote the ending again.

3. I read the entire book and made minor mods.

4. Renni and Shannon (her additionally awesome co-editor/assistant) reread the beginning and the ending and did another quick line edit.

5. I went over that.

6. I got back a critique on the beginning of the book, and made some changes based on that.

7. This inspired me to write two entirely different beginnings.

8. We eventually decided the original was better, although I moved a few nice tidbits from the new stuff over.

9. I reread the whole first half of the book, and the ending again, and made some more improvements.

10. On Sunday I rested.

So now I return to the agent game (referrals very welcome), and to the agonizing internal debate about the relative merits of self publishing in the modern (and very rapidly changing) market. And back to the first draft of my new novel (about 25% done).

If any of you beta readers want a copy of the new improved 95,000 word The Darkening Dream, drop me a note.

Related posts:

  1. Beginnings and Endings
  2. On Writing: Yet Another Draft
  3. The Darkening Dream
  4. On Writing: Passes and Plots
  5. The edits are all in!
By: agavin
Comments (0)
Posted in: Darkening Dream
Tagged as: Andy Gavin, Art, Book, Darkening Dream, drafts, Editing, Fiction, Novel, Proofreading, Sol Stein, The Darkening Dream, Writers Resources, Writing, Writing and Editing

Quick Eats: Caffe Delfini

Mar07

Restaurant: Caffe Delfini

Location: 147 West Channel Road, Santa Monica, CA 90402. tel (310) 459-8823

Date: February 6, 2011

Cuisine: Italian

Rating: Good Italian, great value!

 

Caffe Delfini is one of our regular “sunday night” places. LA has a lot of neighborhood Italians, and so it’s only necessary to go to the one’s with a good kitchen. Delfini consistently delivers very good fare at reasonable places, and they are extremely friendly too, and very accommodating of our messy toddler.

The official Menu is here.

I got a glass of Amarone. I like the grapiness of this very traditional wine from outside of Verona.

“CAESAR SALAD. Hearts of Romaine lettuce, shaved Reggiano cheese, tossed with light Caesar dressing,      and served with homemade garlic croutons. (contains pasteurized eggs).”

“MISTA  SALAD.    Chopped butter lettuce, radicchio, shaved carrots and sliced tomatoes      dressed with extra virgin olive oil and aceto balsamico.”

“INSALATA SPECIALE.   Combination of rugola e radicchio, caprese and prosciutto e melone.” My favorite salad, a bit of everything.

“RIGATONI ALLA NORMA.   Tubular pasta with eggplant, plum tomatoes, scamorza cheese, onion, garlic,     basil, thyme  and a touch of red chili flakes.”

“PENNE AL POMODORO E BASILICO.   Penne pasta with basil and tomato sauce.”

“LINGUINE MARE (white wine sauce). Linguine pasta with Manila clams, N.Z. mussels, shrimp, calamari, snow crab claw,  garlic, parsley and a touch of red chili flakes.”

These aren’t the incredible fresh pastas of a place like Drago, but they are nicely done classics, fresh out of the pot/pan, served searing hot. You could also walk across the street to Il Ristorante di Giorgio Baldi and get them too, but you’d also pay 2-3 times as much, and get a dose of celebrity attitude too.

 

Related posts:

  1. Quick Eats: Divino
  2. Quick Eats: Osteria Latini 2
  3. Quick Eats – Palmeri
  4. Quick Eats: Sunnin
  5. Quick Eats: Osteria Latini
By: agavin
Comments (1)
Posted in: Food
Tagged as: Amarone, Caesar salad, Cook, Insalata Caprese, Italian cuisine, Olive oil, Parmigiano-Reggiano, pasta, Restaurant, Restaurant Review, Salad, side dishes, vegetarian

Sushi Sushi = Yummy Yummy

Mar06

Restaurant: Sushi Sushi [1, 2, 3, 4]

Location: 326 1/2 Beverly Dr. Beverly Hills, CA 90212. (310) 277-1165

Date: March 1, 2011

Cuisine: Japanese Sushi

Rating: Old school sushi – fantastic fish and presentation!

ANY CHARACTER HERE

After discovering this place about a month ago I’ve been three times (previous REVIEW HERE). The craving keeps creeping into my mind. It’s old school sushi without all the distractions, just really good fish and rice (and a bit of other trappings). Last time we got the Omakase, so this time we ordered the basic lunch special (the reasonably priced — for sushi — 10 piece plus appetizer, cut roll, and soup). We then added a bit to it.

Aji (Spanish Mackerel) sashimi, with miso paste, seaweed, and some white kelp or rice noodle (not sure). The paste has a very strong tangy sweetness, and it marries nicely with te mackerel.

Lunch specials come with choice of miso. Normal Shiitake (not pictured), or nameko mushroom (above). I like the firm texture of these little button mushrooms.

Clam miso, saltier, more clam broth flavors.

Homemade real wasabi is a sign of a series sushi restaurant.

8 of the 10 pieces of the lunch special. Two came on a sidecar.

And here is the sidecar. On the left, Uni (sea urchin) and on the right Ikura (salmon egg roe). Both are specular versions of the type. The uni was sweet and soft, the eggs little perfect balls of sharp brine, no bitterness at all.

The sushi itself. Left to right. Maguro (blue fin tuna), Hamachi (yellow tail tuna), chu-toro (medium tuna belly), Tai (red snapper), Sweet Shrimp, and Shimaji (stripe jack). All were delicious. Sushi sushi for the most part puts the wasabi and the soy sauce on the pieces before serving them.

Chopped Toro (tuna belly) cut roll, then Tamago (sweet omelet), and Unagi (fresh water eel). Yum!

My brother doesn’t like uni, so he got Kani (fresh king crab) instead.

Some extra pieces we ordered. Left to right. Ika (squid) with shiso, o-toro (premium tuna belly), and raw Japanese scallop. Again all wonderful.

A Kani (king crab) handroll, with cucumber for crunch. Sushi sushi cuts the handrolls at the bottom to make a little flap of nori (seaweed) that covers the bottom. Small, but elegant, detail.

Baked salmon skin handroll. Always has a nice crunch.

Hamachi (yellowtail) handroll, another classic.

Afterward, walking back to our car, we ran into this temptation.

As always, I went for the coconut cream-cheese.

Not a bad version of the type. The top has the proper extreme sweetness, and there was a dab of whipped filling in the center, a bit like some hostess treat.

If you enjoyed this, make sure to check out the previous review, the next review, or some other good sushi like Sasabune, Nobu, Matsuhisa, Takao, or the incomparable Urwasawa.

Related posts:

  1. Food as Art – Sushi Sushi
  2. Sasabune – Dueling Omakases
  3. Food as Art – Takao
  4. Food as Art: Sasabune
  5. Food as Art: Sushi House Unico
By: agavin
Comments (15)
Posted in: Food
Tagged as: Asian, Atlantic Spanish mackerel, Beverly Hills California, Caviar, crab, Food, Hamachi, Ikura, Japanese cuisine, Miso, Miso soup, Omakase, Restaurant, Restaurant Review, Sashimi, side dishes, Spanish Mackerel, Sushi, Sushi Sushi

Piccolo – A little Italian

Mar05

Restaurant: Piccolo [1, 2]

Location: 5 Dudley Ave, Venice, Ca. 310-314-3222

Date: February  26, 2011

Cuisine: Northern Italian

Rating: Neighborhood Italian, hybridizing toward modern.

 

Piccolo is a neighborhood Italian located in a rather sketchy area of the venice boardwalk. For a previous review, look HERE. I few years ago it was a very Italian place with a veronese regional menu. It’s still very Northern Italian, but under a new chef has been growing more bold and modern. Mostly this consists of deconstructing classic dishes.

The menu.

Parker gives this an 89, “The 2003 Brunello di Montalcino is a pretty, supple wine with sweet red fruit and an accessible personality. The heat of the vintage is felt in the sweet notes of fruit and oak that linger on the finish. Ideally the oak could be a little more integrated and the tannins might be more finessed, but this is a nicely poised effort from Altesino. Anticipated maturity: 2008-2015.”

I would have given this a 90 or 91 myself. It’s a very nice approachable Brunello.

“caprese rivisitata, heirloom tomatoes, burrata, revisited. basil, ligurian olive oil.” Notice we have more or less the traditional ingredients of the Caprese, but they have been deconstructed and reassembled in a new form, as a sort of gelled parfait.

“Tortelli di prosciutto cotto. ravioli filled with truffle-prosciutto cotto, Italian mascarpone sauce, micro celery.” Piccolo has very fine, very fresh egg pastas. This one is stuffed with a bit of ham, and served on a very buttery cheese sauce. The pasta was nicely al dente.

“Large ricotta gnocchi in a butter sauce sauce with a mascarpone foam.” Also a rearrangement of traditional elements.

“agnello al rabarbaro. boneless, natural lamb shank slow-braised in rhubarb-port, tuscan melon-foe gras risotto cake.” At some level an osso bucco with risotto, but with lamb. And slightly deconstructed, the meat is off the bone and piled in these little cylinders. The meat and its sauce was very tasty. The risotto though felt dry and crunchy, and didn’t have that creamy texture I love in good risotto.

The dessert menu.

“Bignole. Pastry puffs filled with Belgian Gianduja chocolate cream.” Close to profiteroles. The inside was mildly hazelnuty, the sauce a classic creme anglais.

“Semifreddo. Imported Amaretto cookies soft-frozen cream.” This was really good. The semifreddo itself a gelato-like ball of Amaretto, with some nice texture too. I love Amaretto, and this tasted very strongly of them, with that nice cold texture. The stripe of sauce is carmel, which made for a lovely convo.

Related posts:

  1. Quick Eats: Piccolo
  2. Fraiche take on Franco-Italian
  3. Sicilian Style – Drago
  4. Quick Eats: Osteria Latini 2
  5. Quick Eats: Divino
By: agavin
Comments (2)
Posted in: Food
Tagged as: Altesino, Brunello di Montalcino, Burrata, Cook, Dessert, Food, Italian cuisine, lamb, pasta, Piccolo, Restaurant, Restaurant Review, Salad, Semifreddo, side dishes, vegetarian, Venice

The Name of the Wind

Mar04

Title: The Name of the Wind

Author: Patrick Rothfuss

Genre: High Fantasy

Length: 255,000 words, 720 pages

Read: May 2008 & Feb 28-Mar 2, 2011

Summary: Best new fantasy of recent years.

_

In 2008, I read this 722 page novel in Xian China during a single sleepless night, and I reread it just now for the second time in preparation for the sequel (released this week): The Wise Man’s Fear. NOTW is a beautiful book. Of all the Fantasy I’ve read in the last 15 or so years, this is perhaps second best after The Song of Ice and Fire. But that’s not to say that they have much in common, other than both being good Fantasy. George R. Martin‘s books are full of characters, POVs, violence, politics, and a darkly realistic sensibility. NOTW is much more focused and relies on more traditional Fantasy tropes. How focused can a 700 page novel be? Not very, but it is good, and it concentrates on a small number of characters and a single (albiet meandering) storyline.

Kvothe is the protagonist. He’s a young man of many many talents, of no means whatsoever, who winds his way from the actor’s troupe to the mean streets to the magical University and to (implied) great and terrible things.

If I have any beef with the book, it’s that the meta premise of the tired hero telling his story is too drawn out. This volume opens in the “present day,” where very little happens except to set us up for the life story of the hero, which is brilliant. Much like Lord of the Rings or Hyperion, the reader must slog for a bit to get to the gold. In this case about 50 pages in. But the slogging isn’t exactly painful because Rothfuss’s prose is lyrical and masterful. Seriously, it’s a wonder given the tangents, bloated conversations (the dialog is great but not efficient), and the like that this book is so easy to read — but it is. Damn easy, even the second time.

The world and the hero juggle uniqueness and heavy — but delicious — borrowing from classic Fantasy of the best sort. I sniffed out a bit of Ursula K. Le Guin (think Wizard of Earthsea), Raymond Feist, Robert Jordan (Wheel of Time), and who knows how many others. The world is extremely well developed, and feels big, but it doesn’t doesn’t have the camp and cheese of Wheel of Time (although it does pay homage). I love origin stories and I very much enjoyed Kvothe’s journey. He’s a great character: humble, proud, skilled, lucky, unlucky all at once, but in a fairly believable way. Perhaps the most important relationship in the book (and there are actually relatively few) is the romance, and it has a tragic quality that feels very refreshing, and slightly reminiscent of the best of Orson Scott Card (think his old stuff like Song Master) or Dan Simmons.

The magic is very unique and interesting, and we focus on it quite a bit, as this is a story that spends a lot of time in the Arcane Academy. This ain’t no Hogwarts either, it feels altogether more mysterious and dangerous. There are several different magic systems interwoven in what is a world overall fairly light on magic. But this is also a world that feels a bit more technological than most Fantasy, with larger cities, a little more like antiquity than the Middle Ages. The “magical bad guys” have a nice character and bit of mystery to them. I don’t like all my mystery explained. There is a lot of music and theatre in here too, and that just helps heighten the lyricism.

But what exactly makes this book so good?

Proving my geek-cred, swapping some Crash Bandicoots for signatures with Patrick Rothfuss

Fundamentally I think Rothfus is just a great writer, and a very good world builder. I don’t think he’s a great plotter. The story drifts along, relies a bit on coincidence and circumstance, and the end fizzles then pops back out of the interior story and waits for the sequel. But that doesn’t really matter, because the prose, world, and characters keep you enjoying every page.

CLICK HERE for my review of the sequel, The Wise Man’s Fear.

Related posts:

  1. Book Review: The Way of Kings
  2. Book Review: The Gathering Storm
  3. Book Review: Uglies
  4. Book Review: The Spirit Thief
  5. Book Review: The Lightning Thief
By: agavin
Comments (6)
Posted in: Books
Tagged as: Arts, Book, Book Review, books, Dan Simmons, Fantasy, Fiction, George R. Martin, High fantasy, Kingkiller Chronicle, Literature, Lord of the Rings, Name of the Wind, Orson Scott Card, Patrick Rothfuss, reviews, Robert Jordan, Ursula K. Le Guin, Wheel of Time, Wise Man's Fear, Wizard of Earthsea

Beginnings and Endings

Mar03

The first thing I did after getting my line editing back over the weekend was work on the ending of my novel. Beginnings and endings are so important, and as is probably typical, I’ve changed them a lot.

The ending is important because it’s what has to wrap everything up, and what leaves the aftertaste in the mouth of the reader. But it isn’t going to do you any good unless they get there.

Which brings us to the beginning. So important in so many ways. First of all, agents and editors glance at the beginning,and if it isn’t awesome, they’ll just put it down right there. Second, so do many readers. They browse the first couple pages in the bookstore (or on Amazon), or even if they buy it, if it doesn’t grab them right away they might just move onto to another book. I know I do.

During revision, The Darkening Dream has already had three different beginnings. But I’ve never been totally satisfied with them. I took a new high level crack at rearranging the flow of my story’s first crucial day, and ended up whipping out two new takes on the first ~7,000 words. That puts three beginnings on the table if you include the current draft. Each have their plus and minuses.

Do I start with the violent supernatural event that kicks everything off?  Do I start with character development on the protagonist? How do I introduce my large cast of characters?

Now that I have a couple takes I’m trying to decide which one to pursue. IF YOU’RE ONE OF MY BETA READERS, HAVE READ THE BOOK ALREADY, and are interested and throwing your opinion into the ring, drop me a note and I’ll send you some options 🙂

The good news about my new novel, is that before I even started writing I found a totally awesome place to start the story. I LOVE the start of that book, and so does everyone I’ve showed it to so far. Lessons learned.

Related posts:

  1. The Darkening Dream
  2. On Writing: Yet Another Draft
  3. On Writing: Passes and Plots
  4. The edits are all in!
  5. Book Review: XVI (read sexteen)
By: agavin
Comments (4)
Posted in: Darkening Dream
Tagged as: Andrew Gavin, Andy Gavin, Arts, Beginnings, Book, books, Creative Writing, Endings, Fiction, Novel, Novel Writing, The Darkening Dream, Writing, Writing and Editing

Quick Eats: Momed

Mar03

Restaurant: Momed

Location: 233 S Beverly Dr, Beverly Hills, CA 90212. (310) 270-4444

Date: January 31 & April 16, 2011

Cuisine: Modern Middle Eastern

Rating: Interesting, and tasty modernized Middle Eastern.

ANY CHARACTER HERE

I met a friend here for lunch. I would have to say at it’s core this place is closest to Lebanese, but everything is very modernized for the contemporary Beverly Hills crowd. That being said, it all tasted really fresh and delicious.

The Menu can be found here.

A lot of the mezza/salads are on display. As you can see, they look pretty good.

We ordered a three “salad” plate with left to right.

1. Humammara, roasted red pepper, walnut and pomegranate. Really nice rich flavor here.

2. Spicy eggplant, oven roasted eggplant with tahini and Urfa chili. Not very spicy, but great texture.

3. Tzatziki, cucumber and yogurt dip. A fine example of the type, and I like the type.

Parsnip hummus with oven-roasted wild mushrooms. The parsnips gave this hummus the texture of very light and fluffy mashed potatoes. It was pretty darn awesome though, and nicely warm.

All these dips were really sold by this most excellent warm homemade pita. This was  no “tear open the supermarket bag” pita. Soft, warm, chewy.

They call this a “pide” (traditional flatbread). Basically like a Naan crossed with a calzone or strombolli. This one is stuffed with “Ohanyan spicy soujuk sausage, red onions, piquillo peppers and akawi cheese.” I mention the strombolli because that is what this reminded me of: a really good fresh version of one of those pizza dough, pepperoni, and cheese rolls. The sausage leaked off a good amount of grease, but it was good.

The following was from a different day, April 16, 2011:


Another three salad plate, left to right:

1. Humammara, roasted red pepper, walnut and pomegranate. Really nice rich flavor here.

2. Avocado Hummus, like a cross between hummus and guacamole!

3. Tzatziki, cucumber and yogurt dip. A fine example of the type, and I like the type.


A different flatbread. Hallomi and akawi cheeses finished with Za’atar. Very nice and cheesy, with interesting and exotic flavors. Lighter than the sausage one for sure.


Yogurt-marinated chicken breast kababs with rice pilaf and marinated Persian cucumbers with chili and poppy seeds.

Related posts:

  1. Quick Eats: Taverna Tony
  2. Quick Eats: Kreation Kafe
  3. Quick Eats: Brentwood
  4. Quick Eats: Sunnin
  5. Quick Eats: Osteria Latini 2
By: agavin
Comments (0)
Posted in: Food
Tagged as: Beverly Hills California, Cooking, Eggplant, Fruit and Vegetable, Humammara, Hummus, Lebanese cuisine, Middle East, Momed, Naan, Pita, Red onion, Restaurant, Restaurant Review, Salad, Şanlıurfa, side dishes, Tzatziki, vegetarian

Machete – The best B-movie ever?

Mar02

Title: Machete

Director/Stars: Danny Trejo (Actor), Robert DeNiro, Jessica Alba, etc.  Robert Rodriguez (Director)

Genre: Exploitationist Action

Watched: February 27, 2011

Summary: Pure action and camp fun.

 

Derived from a fake preview in Rodriguez and Tarantino’s Grindhouse double feature, this film is just rollicking camp fun. The premise: that ex-federale Danny Trejo (the ugliest guy to grace the silver screen since The Elephant Man) is lured into a crazy scheme by various right wing racist nut-jobs and has to kick (and get some) ass in various escapes, revenge, etc.

One of the best things is the roster of amusing casting. These aren’t just cameos either: Robert DeNiro, Jessica Alba, Michelle Rodriguez, Steven Seagal, Jeff Fahey, Cheech Marin, Don Johnson, Linsay Lohan and more.

The plot, as such, is thin, and gratuitously cheesy. The characters however, live large, and the action is fun and inventive and sometimes delightfully nasty.

Before the opening credits, Trejo manages to use his trademark weapon to amputate at least a dozen limbs, leading him to rescue a stark naked girl whose cel phone and weapons are stored where the sun don’t shine. Before this scene ends a fat-ass Steven Seagal uses a katana to behead Trejos wife (standard revenge setup). This pretty much sets the tone for the entire film. My favorite gross-out bit is a bad guy whose intestines (still connected) are used by Machete as a rope to swing out the window and onto the floor below.

Nothing about the movie is realistic. The villains are deliciously over the top, and their crazy scheme to raise drug prices by building an electrified fence between Mexico and Texas purely amusing. People get shot in the head and live. Everything resolves in one of those typical Rodriguez giant shootouts.

What makes the film so fun — besides the crazy action — is the unadulterated camp factor of each of the characters. From Cheech’s merlot-drinking shotgun wielding priest to Robert DeNiro’s evil racist state senator (there are a few of those in real life too!).

Rodriguez just should have gone as over the top with his nudity as with his violence. Too much cutting for a work this gratuitous!

Related posts:

  1. Movie Review: Centurion
  2. Book and Movie Review: Harry Potter and the Deathly Hallows
  3. Movie Review: Adventureland
  4. Book and Movie Review: Let Me In
  5. Book and Movie Review: The Road
By: agavin
Comments (2)
Posted in: Movies
Tagged as: Cheech Marin, Danny Trejo, Fiction, Film, Film Review, Jeff Fahey, Jessica Alba, Lindsay Lohan, Machete, Michelle Rodriguez, Movie Review, reviews, Robert DeNiro, Robert Rodriguez, Steven Seagal

Quick Eats: Kreation Kafe

Mar01

Restaurant: Kreation Kafe

Location: 1023 Montana Ave. Santa Monica, CA 90403. (310) 458-4880

Date: January 21, 2011

Cuisine: Modern Mediterranean

Rating: Tasty and modernized take on kabobs and mezzas

 

On the once bustling Montana (now home to more than a few empty stores) is this little med cafe. They have tables out front and a patio in back. The interior space is tiny. The food is very fresh and organic.

The Menu.

Someone else’s salads.

“Eggplant Dip Flavored with Tomatoes, Red Onion and a touch of Garlic.” Basically Baba ghanuosh, but very fresh. With almonds and a crunchy fennel salad.

“Yogurt Dip Persian Garden Cucumber with diced Shallots, Fresh Mint, Dill and Parsley.” A really good example of the type. Very fresh, with the bright intensity of the Yogurt front and center. There isn’t a lot of garlic here like in a tzatziki.

It all goes nicely with the Persian style flat bread.

“Smoked salmon, various salads, olives, cucumber tomato, red onion, cream cheese, capers.” All very fresh.

“Braised Beef Short Rib Plate.” Like chunks of good tender pot roast. Kind of a cross over between a kabob and Shabbat dinner.

“Braised Beef Short Rib Sandwich.” Same thing, on a roll.

Usually I get the “Niman Ranch Ground Beef Kabob” here, which slathered in the yoghurt sauce is pretty awesome.

Another nice thing about this place is that it’s only a block from Cafe Luxxe, which has hand’s down the best cafe expresso in Los Angeles. This is the most incredible cappuccino, without even the slightest hint of bitterness. It isn’r even hot, body temperature, with the micro foam blended in all perfect. Just goes down easy.

Related posts:

  1. Quick Eats: Sunnin
  2. Quick Eats: Brentwood
  3. Quick Eats: Osteria Latini
  4. Quick Eats: Panini at Home
  5. Quick Eats: Taverna Tony
By: agavin
Comments (0)
Posted in: Food
Tagged as: Cafe Luxxe, cappuccino, coffee, Cooking, Dips, kabobs, Kreation Kafe, Los Angeles, Montana, Red onion, Restaurant, Restaurant Review, salads, Santa Monica California, side dishes, Tomato, Yoghurt
« Newer Posts
Watch the Trailer or

Buy it Online!

Buy it Online!

96 of 100 tickets!

Find Andy at:

Follow Me on Pinterest

Subscribe by email:

More posts on:



Complete Archives

Categories

  • Contests (7)
  • Fiction (404)
    • Books (113)
    • Movies (77)
    • Television (123)
    • Writing (115)
      • Darkening Dream (62)
      • Untimed (37)
  • Food (1,764)
  • Games (101)
  • History (13)
  • Technology (21)
  • Uncategorized (16)

Recent Posts

  • Eating Naples – Palazzo Petrucci
  • Eating San Foca – Aura
  • Eating Otranto – ArborVitae
  • Eating Lecce – Gimmi
  • Eating Lecce – Varius
  • Eating Lecce – Duo
  • Eating Lecce – Doppiozero
  • Eating Torre Canne – Autentico
  • Eating Torre Canne – Beach
  • Eating Monopoli – Orto

Favorite Posts

  • I, Author
  • My Novels
  • The Darkening Dream
  • Sample Chapters
  • Untimed
  • Making Crash Bandicoot
  • My Gaming Career
  • Getting a job designing video games
  • Getting a job programming video games
  • Buffy the Vampire Slayer
  • A Game of Thrones
  • 27 Courses of Truffles
  • Ultimate Pizza
  • Eating Italy
  • LA Sushi
  • Foodie Club

Archives

  • May 2025 (3)
  • April 2025 (4)
  • February 2025 (5)
  • January 2025 (3)
  • December 2024 (13)
  • November 2024 (14)
  • October 2024 (14)
  • September 2024 (15)
  • August 2024 (13)
  • July 2024 (15)
  • June 2024 (14)
  • May 2024 (15)
  • April 2024 (13)
  • March 2024 (9)
  • February 2024 (7)
  • January 2024 (9)
  • December 2023 (8)
  • November 2023 (14)
  • October 2023 (13)
  • September 2023 (9)
  • August 2023 (15)
  • July 2023 (13)
  • June 2023 (14)
  • May 2023 (15)
  • April 2023 (14)
  • March 2023 (12)
  • February 2023 (11)
  • January 2023 (14)
  • December 2022 (11)
  • November 2022 (13)
  • October 2022 (14)
  • September 2022 (14)
  • August 2022 (12)
  • July 2022 (9)
  • June 2022 (6)
  • May 2022 (8)
  • April 2022 (5)
  • March 2022 (4)
  • February 2022 (2)
  • January 2022 (8)
  • December 2021 (6)
  • November 2021 (6)
  • October 2021 (8)
  • September 2021 (4)
  • August 2021 (5)
  • July 2021 (2)
  • June 2021 (3)
  • January 2021 (1)
  • December 2020 (1)
  • September 2020 (1)
  • August 2020 (1)
  • April 2020 (11)
  • March 2020 (15)
  • February 2020 (13)
  • January 2020 (14)
  • December 2019 (13)
  • November 2019 (12)
  • October 2019 (14)
  • September 2019 (14)
  • August 2019 (13)
  • July 2019 (13)
  • June 2019 (14)
  • May 2019 (13)
  • April 2019 (10)
  • March 2019 (10)
  • February 2019 (11)
  • January 2019 (13)
  • December 2018 (14)
  • November 2018 (11)
  • October 2018 (15)
  • September 2018 (15)
  • August 2018 (15)
  • July 2018 (11)
  • June 2018 (14)
  • May 2018 (13)
  • April 2018 (13)
  • March 2018 (17)
  • February 2018 (12)
  • January 2018 (15)
  • December 2017 (15)
  • November 2017 (13)
  • October 2017 (16)
  • September 2017 (16)
  • August 2017 (16)
  • July 2017 (11)
  • June 2017 (13)
  • May 2017 (6)
  • March 2017 (3)
  • February 2017 (4)
  • January 2017 (7)
  • December 2016 (14)
  • November 2016 (11)
  • October 2016 (11)
  • September 2016 (12)
  • August 2016 (15)
  • July 2016 (13)
  • June 2016 (13)
  • May 2016 (13)
  • April 2016 (12)
  • March 2016 (13)
  • February 2016 (12)
  • January 2016 (13)
  • December 2015 (14)
  • November 2015 (14)
  • October 2015 (13)
  • September 2015 (13)
  • August 2015 (18)
  • July 2015 (16)
  • June 2015 (13)
  • May 2015 (13)
  • April 2015 (14)
  • March 2015 (15)
  • February 2015 (13)
  • January 2015 (13)
  • December 2014 (14)
  • November 2014 (13)
  • October 2014 (13)
  • September 2014 (12)
  • August 2014 (15)
  • July 2014 (13)
  • June 2014 (13)
  • May 2014 (14)
  • April 2014 (14)
  • March 2014 (10)
  • February 2014 (11)
  • January 2014 (13)
  • December 2013 (14)
  • November 2013 (13)
  • October 2013 (14)
  • September 2013 (12)
  • August 2013 (14)
  • July 2013 (10)
  • June 2013 (14)
  • May 2013 (14)
  • April 2013 (14)
  • March 2013 (15)
  • February 2013 (14)
  • January 2013 (13)
  • December 2012 (14)
  • November 2012 (16)
  • October 2012 (13)
  • September 2012 (14)
  • August 2012 (16)
  • July 2012 (12)
  • June 2012 (16)
  • May 2012 (21)
  • April 2012 (18)
  • March 2012 (20)
  • February 2012 (23)
  • January 2012 (31)
  • December 2011 (35)
  • November 2011 (33)
  • October 2011 (32)
  • September 2011 (29)
  • August 2011 (35)
  • July 2011 (33)
  • June 2011 (25)
  • May 2011 (31)
  • April 2011 (30)
  • March 2011 (34)
  • February 2011 (31)
  • January 2011 (33)
  • December 2010 (33)
  • November 2010 (39)
  • October 2010 (26)
All Things Andy Gavin
Copyright © 2025 All Rights Reserved
Programmed by Andy Gavin